@ResponseBody を使用して Spring Web MVC @ExceptionHandler を実装して、検証エラーを含むオブジェクトを返そうとしています。(戦略 E はこちらに記載されています)。
Spring 3.0.x では、これが正常に動作しないというバグが確認されましたが、解決されたためです。私はSpring 3.1.2を使用していますが、それを実行するべきではありません。
ただし、「受け入れ可能な表現が見つかりませんでした」という例外が発生しています。
例外は次のとおりです。
[10/21/12 12:56:53:296 CDT] 00000045 ExceptionHand E redacted.loggi
ng.jdk14.LogWrapper error Failed to invoke @ExceptionHandler method: public
redacted.model.view.ValidationErrorResponse redacted.controller.Re
stController.handleValidationException(redacted.util.ValidationExceptio
n,javax.servlet.http.HttpServletResponse)
Originating Class/Method:redacted.web.ui.filter.AccessControlFilter.pr
ocessFilter()
org.springframework.web.HttpMediaTypeNotAccepta
bleException: Could not find acceptable representation
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessage
ConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMeth
odProcessor.java:115)
コードは次のとおりです。
@ExceptionHandler(ValidationException.class)
@ResponseStatus(value = HttpStatus.PRECONDITION_FAILED)
@ResponseBody
public ValidationErrorResponse handleValidationException(ValidationException ex, HttpServletResponse response) {
List<ValidationError> errs = new LinkedList<ValidationError>();
for (ObjectError er : ex.getErrors()) {
errs.add(new ValidationError(er.getObjectName(), er.getDefaultMessage()));
}
return new ValidationErrorResponse(errs);
}
@RequestMapping(value = "/search")
@ResponseBody
public SearchResult search(@Valid @ModelAttribute SearchRequest searchRequest, BindingResult bResult) {
if (bResult.hasErrors()) {
throw new ValidationException(bResult.getAllErrors());
}
return searchService.search(searchRequest);
}
何か案は?