Spring @ExceptionHandler, @ResponseBody不会序列化/封送响应



我有一个非常简单的Spring rest控制器,如下所示:

@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);
    } 
}

和ErrorDetail类…

@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;
    }
}

和自定义异常AAAException扩展了RuntimeException。

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);
    }
}

然而@ExceptionHandler不会编组ErrorDetail对象,我只是得到一个500,我可以从这个方法返回一个字符串,它的工作。我正在发送通过createUser方法正确解组和编组的应用程序/xml,我不明白为什么同样不适合@ExceptionHandler。

我使用的是Spring 4.2.6.

似乎您已经在controller中添加了exception handler方法,因为如果您从controller本身获得exception,它将被触发。使用单独的类处理异常,例如:

@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将对每个controller.应用exception处理

和最重要的部分是你的方法应该抛出异常为了@ExceptionHandler工作改变你的方法签名。

 public User createUser(@RequestBody User user) throw DuplicateEntityException{
    throw new DuplicateEntityException();
    }

嗯,我很尴尬地说,通过代码调试后,问题原来是ErrorDetail类上缺少默认构造函数:-(

最新更新