Валидатор Hibernate проверяет пустое поле, где нет @NotEmpty

У меня проблема с Hibernate Validator 4.3.1.

Проблема в том, что валидатор проверяет поля, пустые и не имеющие аннотаций @NotEmpty.

Когда веб-форма человека отправляется, а адрес, телефон, факс и веб-страница не установлены, выдается ошибка проверки. Я думаю, что это неправильно, потому что нет аннотации @NotEmpty. Я хочу пропустить поля без аннотации @NotEmpty.

Кто-нибудь может объяснить, в чем проблема? Спасибо.

public class Person{

    private String name;
    private String notifiedBodyCode;
    private Address address;
    private String webpage;
    private String phone;
    private String fax;
    private String email;

    @Column(name = "name", length = 100)
    @NotEmpty(message = "{NotEmpty.NotifiedBody.name}")
    @Length(max = 100)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @NotEmpty
    @Column(name = "notified_body_code", length = 25)
    @Length(max = 25)
    public String getNotifiedBodyCode() {
        return notifiedBodyCode;
    }

    public void setNotifiedBodyCode(String notifiedBodyCode) {
        this.notifiedBodyCode = notifiedBodyCode;
    }

    @Valid
    @ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Pattern(regexp = "^(https?://)?[a-z_0-9\\-\\.]+\\.[a-z]{2,4}.*$")
    @Column(name = "web", length = 50)
    public String getWebpage() {
        return webpage;
    }

    public void setWebpage(String webpage) {
        this.webpage = webpage;
    }

    @Length(min = 9, max = 20)
    @Pattern(regexp ="[0-9\\+\\s]")
    @Column(name = "phone", length = 20)
    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Length(min = 9, max = 20)
    @Column(name = "fax", length = 20)
    public String getFax() {
        return fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

}

Адрес

public class Address{


    private String city;
    private String street;
    private String zip;
    private Country country;


    @Length(max = 50)
    @Column( name = "city", length= 50)
    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Length(max = 100)
    @Column( name = "street", length= 100)
    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    @Length(min = 5, max = 6)
    @Pattern(regexp = "^[\\d\\s]$")
    @Column(name = "zip", length = 6)
    public String getZip() {
        return (zip == null ? "" : zip);
    }

    public void setZip(String zip) {
        this.zip = zip;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "country_id")
    public Country getCountry() {
        return country;
    }

    public void setCountry(Country country) {
        this.country = country;
    }

}

Страна

public class Country{

    private String countryName;

    @NotEmpty
    @Length(max = 45)
    @Column(name = "country_name", length = 45)
    public String getCountryName() {
        return countryName;
    }

    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }

    @Override
    public String toString() {
        return "Country [id=" + id + ", countryName=" + countryName + "]";
    }

}

ИЗМЕНИТЬ – Проблема решена.

Проблема была в выражении "^". Вместо этого я должен использовать "[^|]".


person Peter Jurkovic    schedule 04.01.2013    source источник
comment
Чтобы уточнить ваш ответ. На самом деле у вас были аннотации ограничений для полей. Без какой-либо аннотации проверка не происходит, но в вашем случае вы также использовали аннотацию @Pattern, которая не работала для пустой строки.   -  person Hardy    schedule 07.01.2013


Ответы (2)


Было трудно понять ваш вопрос, но я ПРЕДПОЛАГАЮ, что вы говорите, что получаете ошибку проверки, когда телефон пуст.

Это связано с тем, что у вас есть аннотация @Length с определенным минимальным значением.

person beder    schedule 04.01.2013
comment
Но я хочу пропустить проверку полей, не имеющих аннотации @NotEmpty и не являющихся полем. Если данное поле содержит какой-либо символ, то оно будет проверено. - person Peter Jurkovic; 04.01.2013
comment
@Length действительно возвращает значение, если ваше поле имеет значение NULL, поэтому, возможно, ваш телефон устанавливается на пустую строку, а не на NULL в коде, который ее устанавливает. Удалите из org.hibernate.validator.constraints.impl.LenghtValidtor.class: public boolean isValid (строковое значение, ConstraintValidatorContext, limitedValidatorContext) { if (value == null) { return true; } целая длина = значение.длина(); длина возврата ›= мин && длина ‹= макс; } - person beder; 04.01.2013
comment
Спасибо за ответ. Но я не знаю, почему выброшенные ошибки должны соответствовать ^(https?://)?[a-z_0-9\-\.]+\.[az]{2,4}.*$ длина должна быть между 9 и 20 и другие, когда входы пусты. У вас есть идеи, где проблема? - person Peter Jurkovic; 04.01.2013
comment
Есть разница между Empty и null. Если ваши поля пусты, т. е. представляют собой новую или новую строку String(), они не пройдут проверку, поскольку не соответствуют вашим валидаторам @Length и @Pattern. Однако если ваши поля имеют значение NULL, они пройдут проверку, если у вас нет аннотации @NotNull. Итак, как я уже говорил, проблема в том, что ваши поля устанавливаются в пустые строки, а не в нулевые объекты. - person beder; 04.01.2013
comment
Я сделал, но это то же самое. - person Peter Jurkovic; 04.01.2013

Я считаю, что вам нужно создать пользовательскую аннотацию ограничения, чтобы возвращать «true» для нулевого и пустого значения. Проблема, с которой вы можете столкнуться, заключается в том, что когда пользователь щелкает поле ввода, но ничего не вводит, поле автоматически становится пустым, тогда как без какого-либо взаимодействия с полем будет (должно) возвращаться значение null.

Довольно простая инструкция >>> http://codetutr.com/2013/05/29/custom-spring-mvc-validation-annotations/, а затем у вас есть справочная документация по пружинам >>> http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/validation.html, а также http://docs.jboss.org/hibernate/validator/4.0.1/reference/en/html/validator-usingvalidator.html

person Prancer    schedule 17.10.2013