log*_*nes 5 java validation spring hibernate spring-boot
总的来说,我对 Spring 还很陌生,我正在尝试使用 Spring boot。我有一个(希望)快速的问题。我正在尝试构建一个将返回 JSON 的 ReSTful 服务。我已遵循构建 RESTful Web 服务指南,并且可以成功返回 JSON。我已将 JPA 集成到我的 Web 服务中,以便我的数据由数据库支持。
现在,我需要创建一条路径,用户可以在其中创建一个对象,并且我希望验证该对象。我已遵循验证表单输入指南,但我并不是真正尝试创建提供 Web 内容的服务。我想要的是,每当发生验证错误时,返回我自己的自定义 JSON。到目前为止,我还没有找到任何资源来实现这一点,尽管我尝试遵循Petri 的 Sweet Rest API 指南,我发现该指南在多种情况下很有帮助,但在这种情况下似乎不太有效。我正在使用hibernate-validator:5.0.1.Final和休眠以下内容。
@Entity
@Table(name = "PEOPLE")
public class Person{
@Id
@Column(unique = true)
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Min(18)
private long age;
private String name;
//Necessary for JPA
protected Person() {}
public Person(long age, String name) {
this.age = age;
this.name = name;
}
// Getters Omitted
}
Run Code Online (Sandbox Code Playgroud)
然后是我的 PersonController:
@Controller
public class PersonController {
@RequestMapping(value="person/", method=RequestMethod.POST)
@ResponseBody
public ResponseEntity<Person> create(@Valid @RequestBody Person person) {
// Create in DB and return
}
}
Run Code Online (Sandbox Code Playgroud)
这是最严格的方式,如果你发送垃圾 JSON 到这个路由,它会返回 400,这是非常好的。但响应正文是一个 HTML 页面,不太好。所以,我的问题是,有什么方法可以捕获验证错误吗?我尝试将以下内容添加到我的控制器中但没有成功:
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity handleError(MethodArgumentNotValidException ex) {
//generate my own error message
return new ResponseEntity(customErrorClass, HttpStatus.BAD_GATEWAY);
}
Run Code Online (Sandbox Code Playgroud)
我知道 Bad Gateway 不是有效的返回代码,但我用它只是为了证明异常处理程序从未被调用。当我发布到我的休息服务时,我仍然看到 400 Bad Request + HTML。我假设有一些我可以覆盖的合理默认值,但我似乎无法弄清楚它在哪里。我尝试过谷歌搜索和 stackoverflow 搜索,但没有成功。
提前致谢。
更新
如果我修改控制器以BindingResult在方法签名中包含:
@Controller
public class PersonController {
@RequestMapping(value="person/", method=RequestMethod.POST)
@ResponseBody
public ResponseEntity<Person> create(@Valid @RequestBody Person person, BindingResult bindingResult) {
if(bindingResult.hasErrors()){
//handle errors and return
} else {
// Create in DB and return
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以让它发挥作用。(注意,我还必须将 jasper-el jar 添加到我的依赖项中)我之前尝试过这个,但没有让它工作,但原因并不直观。我发布了以下 JSON:{ "id" : "foo", "age": 22, "name" : "James Bond" } 根据JSON 规范,这是有效的 JSON。显然,我的 Person 模型无法将字符串“foo”转换为 long。我不会讨论错误是否应该是 400,我的新问题是:我怎样才能捕获这个 400?
要处理格式错误或不可转换的 JSON,您可以捕获HttpMessageNotReadableException该类
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity handleBadInput(HttpMessageNotReadableException ex) {
Throwable cause = ex.getCause();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13176 次 |
| 最近记录: |