Сложный сценарий использования наследования объектов JSR-303, Tapestry и JPA - PullRequest
0 голосов
/ 17 октября 2011

У меня есть сущность JPA с именем ParentAccount, которая расширяет абстрактную сущность Account (см. Наследование JPA). Я поместил ограничения проверки JSR-303 в сущность Account. Теперь у меня есть следующий класс и шаблоны Tapestry, и проверка JSR-303 не работает:

Класс гобелена:

 public class Inscription {        
    @Property
    //this is not validated...
    private ParentAccount parentAccount;

    @Property
    @Validate("required")
    private String accountPasswordConfirmation;    

    @InjectComponent
    private Form registrationForm;

    @OnEvent(EventConstants.PREPARE)
    void prepareAccount(){
        parentAccount = new ParentAccount();
    }

    @OnEvent(value= EventConstants.VALIDATE)
    void validateRegistrationForm() {
        if(registrationForm.isValid()) {
            if(accountPasswordConfirmation.equals(parentAccount.getAccountPassword())) {
                System.out.println("ok for insert");
            }
        }
    }
}

Гобеленовая страница:

<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
<head>
    <title>Hello World Page</title>
</head>
<body>
<form t:type="form" t:id="registrationForm" validate="this">
    <t:errors/>
    <div>
        <label t:type="label" for="accountEmailAddress"/>
        <input t:type="textfield" t:id="accountEmailAddress" value="parentAccount.accountEmailAddress"/>
    </div>
    <div>
        <label t:type="label" for="accountFirstName"/>
        <input t:type="textfield" t:id="accountFirstName" value="parentAccount.accountFirstName"/>
    </div>
    <div>
        <label t:type="label" for="accountLastName"/>
        <input t:type="textfield" t:id="accountLastName" value="parentAccount.accountLastName"/>
    </div>
    <div>
        <label t:type="label" for="accountPassword"/>
        <input t:type="textfield" t:id="accountPassword" value="parentAccount.accountPassword"/>
    </div>
    <div>
        <label t:type="label" for="accountPasswordConfirmation"/>
        <input t:type="textfield" t:id="accountPasswordConfirmation" value="accountPasswordConfirmation"/>
    </div>
    <div><input type="submit" value="ok"/></div>
</form>
</body>
</html>

К сожалению, несмотря на то, что я аннотировал сущность аннотациями @NotNull, эти ограничения JSR-303 игнорируются.

Может кто-нибудь помочь, пожалуйста?

С уважением,

1 Ответ

1 голос
/ 18 октября 2011

Я заметил, что, если я добавляю аннотацию JSR-303 к свойству в классе Tapestry, это учитывается.Почему тогда Tapestry не будет учитывать аннотацию при размещении на свойстве объекта JPA ??

В Tapestry форма вызывается ValidationTracker , который отслеживает всепредоставленные пользователем ошибки ввода и проверки для каждого поля в форме.

Кажется, по умолчанию ValidationTrackerImpl не волнует.Вы можете предоставить свою реализацию на трекере через параметр трекера формы.Я сделал что-то похожее на Struts2, чтобы мои сущности были проверены.

Может быть (надеюсь) аннотирование вашего parentAccount с помощью @Valid (валидация графа, как его называют в спецификации JSR-303) также работает (при условии Tapestryзаботится).

...