当前位置: 首页 > 知识库问答 >
问题:

Spring@ExceptionHandler、@ResponseBody将不序列化/封送响应

邬浩涆
2023-03-14
@RequestMapping("/management")
@RestController
public class ManagementController {

    @Autowired
    private ManagementService managementService;

    @ExceptionHandler(DuplicateEntityException.class)
    @ResponseStatus(code = HttpStatus.CONFLICT)
    public ErrorDetail handleDuplicateEntityException(DuplicateEntityException ex) {
        return new ErrorDetail(ex.getMessage(), HttpStatus.CONFLICT.value());
    }

    @RequestMapping(value = "/user", method = RequestMethod.POST)
    @ResponseStatus(code = HttpStatus.CREATED)
    public User createUser(@RequestBody User user) {
        return managementService.createUser(user);
    } 
}
@XmlRootElement(name = "error")
@XmlAccessorType(XmlAccessType.FIELD)
public class ErrorDetail {

    @XmlElement(name = "message")
    private String message;

    @XmlAttribute(name = "status")
    private int status;

    public ErrorDetail(String message, int status) {
        super();
        this.message = message;
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public int getStatus() {
        return status;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void setStatus(int status) {
        this.status = status;
    }

}
public class DuplicateEntityException extends AAAException {

    private static final long serialVersionUID = 4223773548694193141L;

    public DuplicateEntityException(String message) {
        super(message);
    }

    public DuplicateEntityException(String message, Throwable cause) {
        super(message, cause);
    }

}

如有任何帮助,将不胜感激。

共有1个答案

吕奇
2023-03-14

您似乎已经在控制器中添加了异常处理程序方法,因为如果您从该控制器本身获得异常时,将触发该方法。使用seperate类进行异常处理例如:

@ControllerAdvice
public class GlobalExceptionController {

@ExceptionHandler(DuplicateEntityException.class)
@ResponseBody
public ErrorDetail handleDuplicateEntityException(DuplicateEntityException ex) {
   ExceptionRepresentation  body = new ExceptionRepresentation(ex.getMessage());
   HttpStatus responseStatus = HttpStatus.CONFLICT;
   return new ResponseEntity<ExceptionRepresentation>(body,responseStatus);
}

在这里,使用@controlleradvice将对每个控制器应用异常处理。

最重要的是,您的方法应该抛出异常,以便@exceptionhandler工作,更改您的方法签名。

 public User createUser(@RequestBody User user) throw DuplicateEntityException{
    throw new DuplicateEntityException();
    }
 类似资料:
  • 有一个奇怪的问题,想不出该怎么处理。有简单的POJO: UPD有双向Hibernate映射,也许它与问题有关。

  • 我正在尝试使用@ResponseBody实现SpringWebMVC@ExceptionHandler,以返回包含验证错误的对象。(此处记录了策略E)。 在Spring3.0。x、 自解决以来,有一个已确认的错误,它阻止了此功能正常工作。我使用的是Spring 3.1.2,不应该碰到它。 然而,我遇到了一个例外“找不到可接受的代表”。 例外情况如下: 代码如下: 有什么想法吗?

  • 这是我得到的错误: 参考文献:http://www.petrikainulainen.net/programming/spring-framework/spring-from-the-trenches-adding-validation-to-a-rest-api/ Spring@ExceptionHandler不能与@ResponseBody一起使用

  • 问题内容: 有一个奇怪的问题,无法弄清楚如何处理。有简单的POJO: 其余端点: 在json响应中,除了Id之外,还有其他所有字段,我需要在前端编辑/删除人员。如何配置Spring Boot来序列化ID? 这就是现在的响应: UPD具有双向hibernate映射,可能与问题有关。 问题答案: 我最近遇到了同样的问题,这是因为默认情况下是这样工作的。请参阅我的SO问题-> 在将应用程序迁移到Spri

  • 我正在使用@ExceptionHandler来管理我的所有异常,并为任何抛出异常的REST API返回一个JSON响应。目前我管理两个异常,第一个是ResourceNotFoundException,它可以工作,但第二个是FileExtensionException,它不工作。它在eclipse控制台中抛出这个异常,而在rest响应中抛出任何东西。 2015-09-21 09:09:05.197错

  • 我使用的是Spring Kafka 1.1.2-Spring Boot 1.5.0 RC版本,并且配置了一个自定义值serialiser/Deserialiser类,扩展/。这些类确实使用Jackson ObjectMapper,它可以通过构造函数提供。 是否可以从Spring上下文中注入ObjectMapper?我已经配置了一个ObjectMapper,我希望在序列化/反序列化程序中重用它。