Я всегда использовал @Valid
и BindingResult
для проверки полей формы.
Теперь, используя Ajax, основанный на этой статье , невозможно использовать BindingResult
вместо или дополнительно к HttpServletResponse
, поскольку это приведет к неправильному запросу (код ошибки HTTP 400).
Как проверить мои поля формы сейчас?
@RequestMapping( value = "/save.html", params = "json", method = RequestMethod.POST )
public @ResponseBody Map<String, ? extends Object> saveJSON( @RequestBody Location location, /* BindingResult result, */ HttpServletResponse response )
{
return Collections.singletonMap( "foo", "foobar" );
}
Это был старый способ без ajax:
@RequestMapping( value = "/save.html", method = RequestMethod.POST )
public String save( @ModelAttribute( "location" ) @Valid Location location, BindingResult result, Map<String, Object> map )
{
Location l;
if ( ( l = service.findByTitle( location.getTitle() ) ) != null )
{
if ( location.getId() != l.getId() )
{
result.addError( new FieldError( "location", "title", messageSource.getMessage( "Unique.location.title", null, null ) ) );
}
}
if ( result.hasErrors() )
{
return "locationform";
}
service.save( location );
return "redirect:/locations/index.html";
}
EDIT
Попробовал это, но в результате нет элемента errors
, который содержит true
при оставлении формы незаполненной (это должно вызвать сообщение @NotEmpty Constraint)
@RequestMapping( value = "/save.html", params = "json", method = RequestMethod.POST )
public @ResponseBody Map<String, ? extends Object> saveJSON( @RequestBody Location location, HttpServletResponse response, Map<String, Object> map )
{
BindingResult result = new BeanPropertyBindingResult( location, "" );
if ( result.hasErrors() ) map.put( "errors", true );
map.put( "foo", "foobar" );
return map;
}