一般而言,我还是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
}
然后是我的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
}
}
这以最严格的方式工作,因为如果您将垃圾JSON发送到此路由,它将返回400,这非常好。但是响应的主体是一个HTML页面,效果不佳。所以,我的问题是,有什么办法可以捕获验证错误?我尝试将以下内容添加到控制器中,但未成功:
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity handleError(MethodArgumentNotValidException ex) {
//generate my own error message
return new ResponseEntity(customErrorClass, HttpStatus.BAD_GATEWAY);
}
我知道Bad Gateway不是有效的返回码,但我只是用它来证明从未调用过Exception处理程序。当我张贴到我的休息服务时,我仍然看到400错误的请求+ HTML。我假设存在一些可以忽略的明智默认值,但我似乎无法弄清楚它在哪里。我试图谷歌搜索和搜索stackoverflow没有运气。
提前致谢。
更新
如果我修改Controller以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
}
}
}
我可以让它工作。(请注意,我还必须将jasper-el jar添加到我的依赖项中)我之前曾尝试过此方法,但并未使其正常工作,但原因并不直观。我使用以下JSON发布:{ "id" : "foo", "age": 22, "name" : "James Bond" }
根据JSON Spec,这是有效的JSON。显然,我的Person Model无法将字符串“ foo”强制转换为long。我将不讨论该错误是否应该是400,我的新问题是:如何捕获这400?
要处理格式错误或不可转换的JSON,可以捕获HttpMessageNotReadableException
该类
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity handleBadInput(HttpMessageNotReadableException ex) {
Throwable cause = ex.getCause();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句