Spring Boot Validation使用JSON响应

对数

一般而言,我还是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spring Boot Json响应被切断

来自分类Dev

Spring Boot Json 格式

来自分类Dev

使用OpenCV的Spring Boot

来自分类Dev

使用JavaFx的Spring Boot

来自分类Dev

使用 Spring Boot 的 BasicAuth

来自分类Dev

OpenAPI在Spring Boot应用程序中转义JSON响应

来自分类Dev

Spring Boot API响应返回重复的嵌套JSON

来自分类Dev

Spring Boot REST仅在JSON响应中显示父代的ID

来自分类Dev

spring-boot 用jackson改变json响应结构

来自分类Dev

在 Spring Boot 中使用 JSON HttpMessageConverters

来自分类Dev

Spring Boot Rest:json 问题

来自分类Dev

如何在Spring Boot中使用websocket并响应js?

来自分类Dev

使用Spring Boot导入数据

来自分类Dev

在Spring Boot中使用@CrossOrigin

来自分类Dev

使用Spring Boot运行测试

来自分类Dev

Spring Boot使用SystemTray图标

来自分类Dev

在Spring Boot中使用@Profile

来自分类Dev

使用Spring Boot的Maven模块

来自分类Dev

使用Spring Boot修复Flyway

来自分类Dev

使用Apache Shiro的Spring Boot

来自分类Dev

使用Spring Boot进行Memcached

来自分类Dev

使用Spring Boot删除表

来自分类Dev

未使用Spring Boot变量

来自分类Dev

Spring Boot,使用Thymeleaf发行

来自分类Dev

在Spring Boot中使用Disruptor

来自分类Dev

使用Spring Boot配置Spring Security

来自分类Dev

使用 Spring Boot 和 Spring Cloud 的 ClassNotFoundException

来自分类Dev

在Spring Boot中异步发送响应

来自分类Dev

Spring Boot存储库POST响应