2014-11-25 2 views
0

Я хочу выполнить встроенную проверку на полях в форме, используя 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-компонент. Но на веб-сайте есть много примеров это не было сделано. Это имеет значение?

ответ

1
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.myco.myapp.FooWidget 

Вы должны компилировать (javac) ваши классы перед вызовом GWT компилятор (и поместить их в пути к классам).

(примечание: генератор валидации GWT должен, вероятно, попытаться загрузить класс из внутреннего TypeOracle GWT, а не из загрузчика классов, а также отметить, что поддержка GWT-Validation почти не поддерживается - кто-то недавно вызвался поддержать ее, но не смог много способствовали)

+0

Спасибо, Томас. Я не знаю, как ввести этот шаг 'javac' в наш процесс сборки.Наш проект использует архетипы GWT maven из https://github.com/tbroyer/gwt-maven-archetypes, и мы используем 'mvn gwt: run -Ddev', а затем новый (GWT2.7.0) инкрементный GWT-компилятор. Любая помощь по этому поводу очень ценится. –

+0

Из вашей заметки, Томас, звучит так, как будто может быть неразумно приступать к использованию GWT-Validation прямо сейчас :-( –

+0

Хм, все должно работать с моими архетипами ... Что касается GWT-валидации, если вы не согласитесь отлаживая и внося исправления назад, я бы не стал его использовать, но я не нашел JSR 303 для начала (это говорит о том, что люди - и крупные компании, которые, как мне кажется, используют его, и у нас было несколько знаки, представляющие интерес для его сохранения, но пока никаких реальных/видимых обязательств) –

 Смежные вопросы

  • Нет связанных вопросов^_^