我对以下方法有例外:
@Transactional
@RequestMapping(method=RequestMethod.PUT)
public @ResponseBody Account create(@Valid @RequestBody CreateAccountRequest request, BindingResult bindingResult)
{ ...
}
引发以下异常:
java.lang.IllegalStateException:一个Errors / BindingResult参数是 预计会立即在模型属性参数之后 控制器方法签名:公共 com.mangofactory.concorde.domain.Account com.mangofactory.concorde.api.AccountService.create(com.mangofactory.concorde.api.rpc.CreateAccountRequest,org.springframework.validation.BindingResult)
根据documentation,我需要添加BindingResult
作为第二个参数。但是,我已经做到了。
它甚至出现在例外中。
我错过了什么?
答案 0 :(得分:4)
事实证明,解决此问题的方法是完全删除BindingResult
属性。
有效的签名是:
public @ResponseBody CreateAccountResponse create(@Valid @RequestBody CreateAccountRequest request)
上第3点的结果
答案 1 :(得分:3)
仅在@ModelAttribute参数之后才支持BindingResult。 @Valid和@RequestBody的组合引发了MethodArgumentNotValidException,默认情况下会将其转换为400错误代码。这在参考文档和@RequestMapping本身中都有记录。
答案 2 :(得分:0)
我认为你不需要@RequestBody
,因为你的CreateAccountRequest
类应该已经指定哪些参数绑定到哪些类型/变量(因此无需使用HttpMessageConverters Spring提供)