gpt4 book ai didi

java - Spring Boot 验证响应 JSON

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:15:50 24 4
gpt4 key购买 nike

总的来说,我对 Spring 还是个新手,我正在尝试使用 Spring 引导。我有一个(希望如此)快速的问题。我正在尝试构建一个将返回 JSON 的 ReSTful 服务。我关注了Building a RESTful Web Service Guide并能成功返回JSON。我已将 JPA 集成到我的 Web 服务中,以便我的数据由数据库支持。

现在,我需要创建一个路由,用户可以在其中创建一个对象,我希望该对象得到验证。我关注了 Validation Form Input Guide但我并没有真正尝试创建提供网络内容的服务。我想要的是,每当发生验证错误时,返回我自己的自定义 JSON。到目前为止,尽管我尝试遵循 Petri's Sweet Rest API Guide,但我还没有找到任何资源来实现这一目标。我发现它在很多场合都有帮助,但在这种情况下似乎不太管用。我正在使用 hibernate-validator:5.0.1.Final 和 hibernate 进行以下操作。

@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 页面。所以,我的问题是,有什么方法可以捕获验证错误吗?我尝试将以下内容添加到我的 Controller 但没有成功:

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity handleError(MethodArgumentNotValidException ex) {
//generate my own error message
return new ResponseEntity(customErrorClass, HttpStatus.BAD_GATEWAY);
}

我知道 Bad Gateway 不是有效的返回码,但我用它只是为了证明从未调用异常处理程序。当我发布到我的休息服务时,我仍然看到 400 Bad Request + 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。显然,我的人物模型无法将字符串“foo”转换为长字符串。我不会讨论错误是否应该是 400,我的新问题是:如何捕获这个 400?

最佳答案

要处理格式错误或不可转换的 JSON,您可以捕获 HttpMessageNotReadableException

@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity handleBadInput(HttpMessageNotReadableException ex) {
Throwable cause = ex.getCause();

关于java - Spring Boot 验证响应 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20707485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com