@Valid Spring-MVC выбрасывает несуществующие ошибки формы - PullRequest
2 голосов
/ 01 сентября 2011

У меня странная проблема в том, что я пытаюсь отредактировать существующий объект Company через контроллер Spring MVC, на котором есть несколько правил проверки.Проверка запускается с помощью @Valid.

@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(@Valid Company company, BindingResult result, SessionStatus status) {
    if(result.hasErrors()) {
        return view("edit");
    } else {
        companyService.saveCompany(company);
        status.setComplete();

        return redirect("?isSaved=true");
    }
}

Отдельные проверки на объекте Company проходят модульные тесты.При использовании в других частях приложения они работают нормально.Однако для одной из форм Spring всегда выдает ошибки, такие как «Поле не должно быть пустым» или «неверный формат номера телефона», но данные на самом деле правильные.

Хуже всего в этой ситуациичто этот код был в игре более года - это просто простой экран «Изменить информацию о вашей компании».Он вдруг просто перестал работать.Независимо от того, что я отправлю в форму, Spring выдаст эти ошибки.

Я проверил и перепроверил все, что могло пойти не так.Он загружает правильный объект компании.Он также публикует правильные значения тоже.В качестве проверки работоспособности я даже отображаю точные объекты ошибок после отправки формы:

Field error in object 'company' on field 'phoneNumber': rejected value [451-324-3232]; codes [Pattern.company.phoneNumber,Pattern.phoneNumber,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [company.phoneNumber,phoneNumber]; arguments []; default message [phoneNumber],[Ljavax.validation.constraints.Pattern$Flag;@2c99f9,(\()?(\d){3}(\))?(\s|-)(\d){3}(\s|-)(\d){4}]; default message [Must be of the form: ###-###-####]
Field error in object 'company' on field 'name': rejected value [somewhere]; codes [NotEmpty.company.name,NotEmpty.name,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [company.name,name]; arguments []; default message [name]]; default message [Name may not be empty]
Field error in object 'company' on field 'address.address': rejected value [135431]; codes [NotEmpty.company.address.address,NotEmpty.address.address,NotEmpty.address,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [company.address.address,address.address]; arguments []; default message [address.address]]; default message [Address may not be empty]

Как видите, значения верны, но все равно выдает ошибки.

Кроме того, у объекта компании есть идентификатор - он не теряется или что-то в этом роде.

Если я удаляю @Valid, все работает.Все значения меняются, поэтому я знаю, что это напрямую связано с @Valid.Но что?

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

public class Company extends DomainObject {

    @NotEmpty(message = "{company.name.notEmpty}")
    private String name;

    @Valid
    private Address address = new Address();

    @Pattern(message = "{company.phoneNumber.valid}",
        regexp = "(\\()?(\\d){3}(\\))?(\\s|-)(\\d){3}(\\s|-)(\\d){4}")
    private String phoneNumber = "";
    private boolean isEnabled = true;
    private boolean homepageViewable = true;
    private int coursesCreated = 0;

    @Valid
    private Theme theme = new Theme();

Не имеет значения, что я положил в эти поля - я все еще получаю ошибки.Кроме того, при тестировании этих проверок в изоляции, они работают.Фактически, когда @Valid используется для объекта Company в других частях системы (например, в форме регистрации), он тоже работает.

Таким образом, единственная часть, где он не работает, - это CompanyЭкраны профиля.

Есть ли причина, по которой Spring-MVC будет делать это?Я в полном недоумении.Я даже не знаю, какого черта я сделал, чтобы вызвать эту проблему.Не похоже, чтобы какие-либо модульные / интеграционные тесты провалились, когда я вносил измененияМеня никогда не предупреждали, что это проблема, пока я не попробовал эти экраны вручную - обычное раздражение при использовании Spring / Java, потому что во многих случаях модульные / интеграционные тесты немного отличаются от использования реального производственного контейнера, поэтому проблемы все равно исчезают.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 01 сентября 2011

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

Можете ли вы попробовать присоединить @ModelAttribute к аргументу компании? * Т.е. 1003 *

@ModelAttribute @Valid Company company

Помогает ли?

...