Я хочу выполнить встроенную проверку на полях в форме, используя JSR-303. Проверка inline (aka on-fly-fly), я имею в виду, что каждое поле проверяется, когда пользователь работает через форму (например, при размытии или нажатии клавиши), , в отличие от отложенной проверки до нажатия кнопки отправки. Обычно сообщения об ошибках отображаются рядом с полем ввода.Встроенная проверка с использованием JSR-303 в GWT, часть 1: проверка на TextBox завершается с ошибкой. Зачем?
Я в соответствии с процедурами, описанными в GWT validation dev guide , где приведен пример показывает JSR-303 ограничения определяется для полей (в данном случае только одно поле, name
) в Person
класса:
// Copied from http://www.gwtproject.org/doc/latest/DevGuideValidation.html
public class Person implements Serializable {
@NotNull
@Size(min = 4, message = "Name must be at least 4 characters long.")
private String name;
}
класс (ы) (только Person
в данном случае) должны быть проверены определены следующим образом:
// Copied from http://www.gwtproject.org/doc/latest/DevGuideValidation.html
public final class MyValidatorFactory 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);
}
}
Пусть у меня есть TextBox
, на котором я хочу выполнить встроенную проверку. Я пытаюсь определить ограничения, как это:
// Example of code that does not work!
import com.google.gwt.user.client.ui.TextBox;
import javax.validation.constraints.Pattern;
public class FooWidget extends TextBox {
@Pattern(regexp="^[0-9]+$", message="Foo: expected digits.")
public String getFoo() {
return getValue(); // from TextBox
}
}
с соответствующим определением в MyValidatorFactory
:
// Example of code that does not work!
@GwtValidation(FooWidget.class)
public interface GwtValidator extends Validator {
}
Однако это не компилируется (я использую GWT 2.7.0), производя следующие ошибки:
[ERROR] An internal compiler exception occurred
com.google.gwt.dev.jjs.InternalCompilerException: Unexpected error during visit.
at com.google.gwt.dev.jjs.ast.JVisitor.translateException(JVisitor.java:121)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:296)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:285)
at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:128)
at com.google.gwt.dev.jjs.ast.JCastOperation.traverse(JCastOperation.java:67)
at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:381)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:293)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:285)
at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:128)
at com.google.gwt.dev.jjs.ast.JDeclarationStatement.traverse(JDeclarationStatement.java:49)
at com.google.gwt.dev.jjs.ast.JModVisitor$ListContext.traverse(JModVisitor.java:95)
at com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemove(JModVisitor.java:351)
at com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:92)
at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:381)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:293)
at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:149)
at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:145)
at com.google.gwt.dev.jjs.ast.JMethodBody.traverse(JMethodBody.java:83)
at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:381)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:293)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:285)
at com.google.gwt.dev.jjs.ast.JMethod.visitChildren(JMethod.java:600)
at com.google.gwt.dev.jjs.ast.JMethod.traverse(JMethod.java:569)
at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:381)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:293)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:285)
at com.google.gwt.dev.jjs.impl.UnifyAst.mainLoop(UnifyAst.java:1505)
at com.google.gwt.dev.jjs.impl.UnifyAst.exec(UnifyAst.java:870)
at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler$Precompiler.unifyJavaAst(JavaToJavaScriptCompiler.java:1305)
at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler$Precompiler.constructJavaAst(JavaToJavaScriptCompiler.java:1038)
at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler$Precompiler.precompile(JavaToJavaScriptCompiler.java:954)
at com.google.gwt.dev.jjs.MonolithicJavaToJavaScriptCompiler.precompile(MonolithicJavaToJavaScriptCompiler.java:303)
at com.google.gwt.dev.jjs.JavaScriptCompiler.precompile(JavaScriptCompiler.java:38)
at com.google.gwt.dev.Precompile.precompile(Precompile.java:286)
at com.google.gwt.dev.Precompile.precompile(Precompile.java:229)
at com.google.gwt.dev.Precompile.precompile(Precompile.java:145)
at com.google.gwt.dev.Compiler.run(Compiler.java:206)
at com.google.gwt.dev.codeserver.Recompiler.doCompile(Recompiler.java:333)
at com.google.gwt.dev.codeserver.Recompiler.compile(Recompiler.java:161)
at com.google.gwt.dev.codeserver.Recompiler.recompile(Recompiler.java:119)
at com.google.gwt.dev.codeserver.Outbox.recompile(Outbox.java:128)
at com.google.gwt.dev.codeserver.JobRunner.recompile(JobRunner.java:81)
at com.google.gwt.dev.codeserver.JobRunner.access$100(JobRunner.java:34)
at com.google.gwt.dev.codeserver.JobRunner$2.run(JobRunner.java:73)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.myco.myapp.FooWidget
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:260)
at com.google.gwt.validation.rebind.BeanHelperCache.createHelper(BeanHelperCache.java:85)
at com.google.gwt.validation.rebind.ValidatorGenerator.generateGwtSpecificValidator(ValidatorGenerator.java:131)
at com.google.gwt.validation.rebind.ValidatorGenerator.generate(ValidatorGenerator.java:67)
at com.google.gwt.core.ext.IncrementalGenerator.generateNonIncrementally(IncrementalGenerator.java:40)
at com.google.gwt.dev.javac.StandardGeneratorContext.runGeneratorIncrementally(StandardGeneratorContext.java:760)
at com.google.gwt.dev.cfg.RuleGenerateWith.realize(RuleGenerateWith.java:160)
at com.google.gwt.dev.shell.StandardRebindOracle$Rebinder.rebind(StandardRebindOracle.java:79)
at com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:276)
at com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:265)
at com.google.gwt.dev.DistillerRebindPermutationOracle.getAllPossibleRebindAnswers(DistillerRebindPermutationOracle.java:87)
at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.createStaticRebindExpression(UnifyAst.java:485)
at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.createRebindExpression(UnifyAst.java:443)
at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.handleMagicMethodCall(UnifyAst.java:576)
at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.endVisit(UnifyAst.java:306)
at com.google.gwt.dev.jjs.ast.JMethodCall.traverse(JMethodCall.java:248)
at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:381)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:293)
... 47 more
[ERROR] at _FooWidgetValidator.java(6): GWT.create(_FooWidgetValidator.class)
com.google.gwt.dev.jjs.ast.JMethodCall
[ERROR] at _FooWidgetValidator.java(6): (_FooWidgetValidator) GWT.create(_FooWidgetValidator.class)
com.google.gwt.dev.jjs.ast.JCastOperation
[ERROR] at _FooWidgetValidator.java(6): final static _FooWidgetValidator INSTANCE = (_FooWidgetValidator) GWT.create(_FooWidgetValidator.class)
com.google.gwt.dev.jjs.ast.JDeclarationStatement
[ERROR] at _FooWidgetValidator.java(5): {
final static _FooWidgetValidator INSTANCE = (_FooWidgetValidator) GWT.create(_FooWidgetValidator.class);
}
com.google.gwt.dev.jjs.ast.JBlock
[ERROR] at _FooWidgetValidator.java(5): {
final static _FooWidgetValidator INSTANCE = (_FooWidgetValidator) GWT.create(_FooWidgetValidator.class);
}
com.google.gwt.dev.jjs.ast.JMethodBody
[ERROR] at _FooWidgetValidator.java(5): private static final void $clinit();
com.google.gwt.dev.jjs.ast.JMethod
[ERROR] Compiler returned false
Что здесь происходит и почему это не работает?
Сообщения об ошибках относятся к сгенерированному исходному коду. Я хотел бы знать, как связать их с моим исходным кодом. .. без точного понимания того, что сломан, прибегает к экспериментальным изменениям в поисках затруднительного :-(
Одним из таких экспериментальных изменений добывают что-то, что, кажется, работает я отправил еще один вопрос о том, что: Inline validation using JSR-303 in GWT, part 2: A good implementation?, так что если хотите, чтобы предложить, как сделать инлайн проверки, может посмотреть на этот вопрос Этот вопрос о понимании того, почему подход положить ограничения внутри моего FooWidget не работает
Еще одна деталь:.. Я знаю, что класс, подлежащий проверке, должен реализовывать Serializable, так как это не значит, что это не Java-компонент. Но на веб-сайте есть много примеров это не было сделано. Это имеет значение?
Спасибо, Томас. Я не знаю, как ввести этот шаг 'javac' в наш процесс сборки.Наш проект использует архетипы GWT maven из https://github.com/tbroyer/gwt-maven-archetypes, и мы используем 'mvn gwt: run -Ddev', а затем новый (GWT2.7.0) инкрементный GWT-компилятор. Любая помощь по этому поводу очень ценится. –
Из вашей заметки, Томас, звучит так, как будто может быть неразумно приступать к использованию GWT-Validation прямо сейчас :-( –
Хм, все должно работать с моими архетипами ... Что касается GWT-валидации, если вы не согласитесь отлаживая и внося исправления назад, я бы не стал его использовать, но я не нашел JSR 303 для начала (это говорит о том, что люди - и крупные компании, которые, как мне кажется, используют его, и у нас было несколько знаки, представляющие интерес для его сохранения, но пока никаких реальных/видимых обязательств) –