我有一个非常简单的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类上缺少默认构造函数:-(