当前位置: 首页 > 知识库问答 >
问题:

如何使用客户端验证器验证方法调用的返回值在EditorDriver上设置ConstraintViolations

山鸿彩
2023-03-14

使用GWT 2.5.0,我想使用客户端验证和编辑器。在尝试传递ConstraintViolationjava.util时,我遇到了以下错误。设置为EditorDriver,如下所示。

Validator a = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Person>> b = a.validate(person);
editorDriver.setConstraintViolations(b);

< code >方法setConstraintViolations(Iterable

我能找到的唯一一篇相关帖子是问题6270!

下面是一个使用Person编辑器打开PopUpDialog的例子,它允许您指定一个名称并根据您的注释验证它。注释掉< code > person driver . setconstraintviolations(违例);行将允许您运行该示例。

我没有足够的信誉点来张贴示例的图像。

public class Person {

@NotNull(message = "You must have a name")

@Size(min = 3, message = "Your name must contain more than 3 characters")

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}
public class PersonEditorDialog extends DialogBox implements Editor<Person> {

private static PersonEditorDialogUiBinder uiBinder = GWT
        .create(PersonEditorDialogUiBinder.class);

interface PersonEditorDialogUiBinder extends
        UiBinder<Widget, PersonEditorDialog> {
}

private Validator validator;

public PersonEditorDialog() {
    validator = Validation.buildDefaultValidatorFactory().getValidator();
    setWidget(uiBinder.createAndBindUi(this));
}

interface Driver extends SimpleBeanEditorDriver<Person, PersonEditorDialog> {
};

@UiField
ValueBoxEditorDecorator<String> nameEditor;

@UiField
Button validateBtn;

private Driver personDriver;

@UiHandler("validateBtn")
public void handleValidate(ClickEvent e) {
    Person created = personDriver.flush();
    Set<ConstraintViolation<Person>> violations = validator
            .validate(created);
    if (!violations.isEmpty() || personDriver.hasErrors()) {
        StringBuilder violationMsg = new StringBuilder();
        for (Iterator<ConstraintViolation<Person>> iterator = violations.iterator(); iterator.hasNext();) {
            ConstraintViolation<Person> constraintViolation = (ConstraintViolation<Person>) iterator
                    .next();
            violationMsg.append(constraintViolation.getMessage() + ",");
        }
        Window.alert("Detected violations:" + violationMsg);
         personDriver.setConstraintViolations(violations);
    }
}

@Override
public void center() {
    personDriver = GWT.create(Driver.class);
    personDriver.initialize(this);
    personDriver.edit(new Person());
    super.center();
}
}
public final class SampleValidationFactory extends AbstractGwtValidatorFactory {

/**
 * Validator marker for the Validation Sample project. Only the classes and
 * groups listed in the {@link GwtValidation} annotation can be validated.
 */
@GwtValidation(Person.class)
public interface GwtValidator extends Validator {
}

@Override
public AbstractGwtValidator createValidator() {
    return GWT.create(GwtValidator.class);
}
}
public class EditorValidationTest implements EntryPoint {


/**
 * This is the entry point method.
 */
public void onModuleLoad() {
    PersonEditorDialog personEditorDialog = new PersonEditorDialog();
    personEditorDialog.center();
}
}
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:e="urn:import:com.google.gwt.editor.ui.client">
<ui:style>
    .important {
        font-weight: bold;
    }
</ui:style>
<g:HTMLPanel>
    <g:Label>Enter your Name:</g:Label>
    <e:ValueBoxEditorDecorator ui:field="nameEditor">
        <e:valuebox>
            <g:TextBox />
        </e:valuebox>
    </e:ValueBoxEditorDecorator>
    <g:Button ui:field="validateBtn">Validate</g:Button>
</g:HTMLPanel>
</ui:UiBinder> 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.5.0//EN"
"http://google-web-toolkit.googlecode.com/svn/tags/2.5.0/distro-source/core/src/gwt-module.dtd">
<module rename-to='editorvalidationtest'>
<inherits name='com.google.gwt.user.User' />
<inherits name='com.google.gwt.user.theme.clean.Clean' />
<inherits name="com.google.gwt.editor.Editor"/>

<!-- Validation module inherits -->

<inherits name="org.hibernate.validator.HibernateValidator" />
<replace-with
    class="com.test.client.SampleValidationFactory">
    <when-type-is class="javax.validation.ValidatorFactory" />
</replace-with>

<!-- Specify the app entry point class. -->
<entry-point class='com.test.client.EditorValidationTest' />

<!-- Specify the paths for translatable code -->
<source path='client' />
<source path='shared' />

</module>
    < Li > hibernate-validator-4 . 1 . 0 . final . jar < Li > hibernate-validator-4 . 1 . 0 . final-sources . jar < li >验证-api-1.0.0.GA.jar(在GWT SDK中) < li >验证-api-1.0.0.GA-sources.jar(在GWT SDK中) < li>slf4j-api-1.6.1.jar < li>slf4j-log4j12-1.6.1.jar < li>log4j-1.2.16.jar

共有2个答案

徐帅
2023-03-14

这是我一遍又一遍地做的:

    List<ConstraintViolation<?>> adaptedViolations = new ArrayList<ConstraintViolation<?>>();
    for (ConstraintViolation<Person> violation : violations) {
        adaptedViolations.add(violation);
    }
    editorDriver.setConstraintViolations(adaptedViolations);

驱动程序定义了通配符泛型类型,无法传入类型化约束冲突。

鲁滨海
2023-03-14

正如评论中所讨论的,以下转换被确定为有效的解决方法。

Set<?> test = violations; 
editorDriver.setConstraintViolations((Set<ConstraintViolation<?>>) test);
 类似资料:
  • 因此,为了实现这个逻辑,我认为我需要在客户端验证JWT令牌。Q1,这是一个明智的做法吗。 Q2,我正在使用的库似乎需要一个公钥才能使用它的函数。我似乎没有公钥,只有一个秘密,这是我刚刚编造的,所以它不是用一对生成的。我的公钥从何而来,或者是否有另一种方法来验证我的令牌而不使用此方法? 这一切似乎应该是显而易见的,我错过了一些东西,所以很抱歉,如果这是一个愚蠢的问题,但我似乎找不到答案?

  • 问题内容: 进行客户端或服务器端验证哪个更好? 在我们的情况下,我们正在使用 jQuery和MVC。 在我们的视图和控制器之间传递的JSON数据。 我所做的许多验证工作都是在用户输入数据时对其进行验证。例如,我使用该事件来防止文本框中的字母,设置最大字符数,并且该数字在一定范围内。 我想更好的问题是,与客户端相比,进行服务器端验证是否有任何好处? 真棒的答案大家。我们拥有的网站受到密码保护,并且用

  • 我看到这个问题已经被问了很多次,但是没有一个答案是有效的,所以我请求帮助和一些见解。 我使用laravel回声和redis广播事件。我的laravel回声服务器启动得很好,redis运行得很好。 重新加载网页时,在laravel echo服务器终端中出现以下错误: 我一直在做这件事,但没有什么能帮上忙。 这是我的 这里是我的 我的 这是我的larave echo服务器。json 当我触发事件时,我

  • 现在,我正在用Spring MVC开发一个web应用程序。 样品值可以是“0.05”、“1.00”、“12.55”等。 因此,如果有任何办法来解决这个问题,请点亮我。谢了。

  • 我知道这个话题已经出现了很多次,而且已经有很多票了。但是在看了数百张票和页面后,我没有找到必要的架构信息。 我计划的是一个简单的SPA(Angular)-REST后端(单独的.NETCore2.1WebAPI)设置。我有keydepot通过OpenId Connect提供身份验证。我正在为Angular使用一个OpenId包来与Key斗篷通信,以获取id和访问令牌。 我想要的是Angular客户端