Spring Data REST 在哪里构建异常 JSON 回复?

Posted

技术标签:

【中文标题】Spring Data REST 在哪里构建异常 JSON 回复?【英文标题】:Where does Spring Data REST build Exception JSON reply? 【发布时间】:2017-11-28 15:04:07 【问题描述】:

我正在使用 Spring Boot 1.5.3、Spring Data REST、Spring HATEOAS、Hibernate。 Spring Data REST 以一种漂亮的方式管理异常,返回格式良好的 JSON 对象,如下所示:

    
    "timestamp": "2017-06-24T16:08:54.107+0000",
    "status": 500,
    "error": "Internal Server Error",
    "exception": "org.springframework.dao.InvalidDataAccessApiUsageException",
    "message": "org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved beforeQuery current operation : com.test.server.model.workflows.WorkSession.checkPoint -> com.test.server.model.checkpoints.CheckPoint; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved beforeQuery current operation : com.test.server.model.workflows.WorkSession.checkPoint -> com.test.server.model.checkpoints.CheckPoint",
    "path": "/api/v1/workSessions/start"

我需要本地化异常消息,并且我想保持 Spring Data REST 的相同 JSON 格式,并看看它们是如何创建异常对象的。 我正在寻找在源代码中创建异常的代码,但我找不到。也许ExceptionMessage 有用,但它没有最终到达用户的对象的结构。

创建异常的点在哪里?

【问题讨论】:

从异常消息看来,异常是在保存阶段创建的。似乎与数据库中非真正创建的对象有某种关系 @AngeloImmediate 我不关心异常本身。我对 Spring Data REST 如何以这种方式创建 JSON 对象感兴趣。与异常无关,JSON 对象始终如此。我想找到创建该对象的代码。谢谢 【参考方案1】:

有一个答案,来自有用的链接

如错误处理文档中所述,您可以提供 你自己的 bean 实现 ErrorAttributes 来控制 内容。

这是文档中的示例:

@ControllerAdvice(basePackageClasses = FooController.class)
public class FooControllerAdvice extends ResponseEntityExceptionHandler 

    @ExceptionHandler(YourException.class)
    @ResponseBody
    ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) 
        HttpStatus status = getStatus(request);
        return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);
    

    private HttpStatus getStatus(HttpServletRequest request) 
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == null) 
            return HttpStatus.INTERNAL_SERVER_ERROR;
        
        return HttpStatus.valueOf(statusCode);
    
  

只需将 Locale 注入到 handleControllerException 方法中,将 MessageSource 注入到 advice 中,并在 handleControllerException 中获取您需要的本地化异常消息

【讨论】:

【参考方案2】:

终于在没看到之前找到了一个有用的链接:Modify default JSON error response from Spring Boot Rest Controller。

所以我要找的对象在这里:https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/error/DefaultErrorAttributes.java

【讨论】:

以上是关于Spring Data REST 在哪里构建异常 JSON 回复?的主要内容,如果未能解决你的问题,请参考以下文章

通过 REST 控制器使用 Spring Data JPA 和 QueryDsl 的异常

构建RESTful服务(使用Spring Data JPA)

将业务逻辑添加到 spring-data-rest 应用程序

Spring MongoRepository,在哪里捕获异常?

apache cxf rest服务中的Spring异常

如何测试 Spring Data Rest @RepositoryRestResource?