У меня есть приложение, использующее проверку бина в 50 классах домена. Он работал месяцами без каких-либо проблем, используя @Valid в контроллерах Spring MVC.
Внезапно я сделал много областей "ленивыми" в Hibernate, чтобы улучшить производительность. Мне приходилось сталкиваться со всевозможными странными проблемами, начиная с метода equals (), который больше не работает, и заканчивая сбоем объектов, потому что данные не были загружены.
Я столкнулся с очень странной проблемой, когда я am загружаю данные в атрибут сеанса в форме Spring MVC, представление корректно отображает его, но при передаче в @Valid сообщает ALL полей с ошибками, даже если данные действительны на 100%.
public class EducationFacility extends DomainObject {
/* Members */
@NotEmpty(message = "{educationFacility.name.notEmpty}")
private String name;
@Valid
private Address address = new Address();
@Pattern(message = "{educationFacility.phoneNumber.valid}",
regexp = "(\\()?(\\d){3}(\\))?(\\s|-)(\\d){3}(\\s|-)(\\d){4}")
private String phoneNumber = "";
...
}
Вот определение гибернации:
<class name="jobprep.domain.educationfacility.EducationFacility" table="education_facility">
<id name="id" column="education_facility_id" type="long">
<generator class="native" />
</id>
<property name="name" column="name"/>
<component name="address" class="jobprep.domain.educationfacility.Address">
<property name="address" column="address"/>
<property name="postalCode" column="postal_code"/>
<many-to-one name="province" class="jobprep.domain.educationfacility.Province" column="province_id" />
</component>
<property name="phoneNumber" column="phone_number"/>
<property name="isEnabled" column="is_enabled"/>
<property name="homepageViewable" column="homepage_viewable" />
<property name="coursesCreated" />
<many-to-one name="admin" class="jobprep.domain.user.Admin" column="admin_id" />
<many-to-one name="director" class="jobprep.domain.educationfacility.Director"
column="director_id" cascade="all" />
<bag name="teachers" inverse="true" cascade="all-delete-orphan" order-by="username asc">
<key column="education_facility_id" />
<one-to-many class="jobprep.domain.teacher.Teacher" />
</bag>
<bag name="students" inverse="true" cascade="all-delete-orphan" order-by="username asc">
<key column="student_education_facility_id" />
<one-to-many class="jobprep.domain.student.Student"/>
</bag>
<bag name="ipRestrictions" inverse="true" cascade="all-delete-orphan">
<key column="education_facility_id" />
<one-to-many class="jobprep.domain.educationfacility.IpRestriction" />
</bag>
<bag name="allowedModules" table="education_facility_to_module"
inverse="false" lazy="true">
<key column="education_facility_id" />
<many-to-many class="jobprep.domain.module.Module" column="module_id"/>
</bag>
</class>
Вот определение контроллера:
@Controller
@RequestMapping("/myEducationFacility")
@SessionAttributes("educationFacility")
@PreAuthorize("hasRole('ROLE_DIRECTOR')")
public class MyEducationFacilityController extends ControllerSupport {
....
}
Вот метод сохранения MVC:
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(@Valid EducationFacility educationFacility, BindingResult result, SessionStatus status) {
if(result.hasErrors()) {
return view("index");
} else {
adminService.saveEducationFacility(educationFacility);
status.setComplete();
return redirect("?complete=true");
}
}
Вот ошибки, которые Spring добавляет к результату привязки при вызове save () Spring. Это совершенно неправильно:
{org.springframework.validation.BindingResult.educationFacility=org.springframework.validation.BeanPropertyBindingResult: 4 errors
Field error in object 'educationFacility' on field 'phoneNumber': rejected value [(519) 254-3678]; codes [Pattern.educationFacility.phoneNumber,Pattern.phoneNumber,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [educationFacility.phoneNumber,phoneNumber]; arguments []; default message [phoneNumber],[Ljavax.validation.constraints.Pattern$Flag;@29895454,(\()?(\d){3}(\))?(\s|-)(\d){3}(\s|-)(\d){4}]; default message [Must be of the form: ###-###-####]
Field error in object 'educationFacility' on field 'address.address': rejected value [Windsor]; codes [NotEmpty.educationFacility.address.address,NotEmpty.address.address,NotEmpty.address,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [educationFacility.address.address,address.address]; arguments []; default message [address.address]]; default message [Address may not be empty]
Field error in object 'educationFacility' on field 'name': rejected value [Catholic School Board]; codes [NotEmpty.educationFacility.name,NotEmpty.name,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [educationFacility.name,name]; arguments []; default message [name]]; default message [Name may not be empty]
Field error in object 'educationFacility' on field 'address.postalCode': rejected value [N9a 2a5]; codes [Pattern.educationFacility.address.postalCode,Pattern.address.postalCode,Pattern.postalCode,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [educationFacility.address.postalCode,address.postalCode]; arguments []; default message [address.postalCode],[Ljavax.validation.constraints.Pattern$Flag;@29895454,[a-zA-Z]\d[a-zA-Z](\s|-)\d[a-zA-Z]\d]; default message [Postal Code must be of the format: a#a-#a#], educationFacility=class jobprep.domain.educationfacility.EducationFacility{id=3}}
Помощь