2016-08-18 40 views
0

我有一個非常簡單的彈簧安置控制器如下:春@ExceptionHandler,將@ResponseBody不序列化/元帥響應

@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,我可以從該方法返回一個字符串和它的作品。我發送的application/xml通過createUser方法被正確解組和編組,我無法理解爲什麼它們不能用於@ExceptionHandler。

我使用Spring 4.2.6。

任何幫助將不勝感激。

+0

調試後說,請發表您的'DuplicateEntityException'類.. –

+0

添加DuplicateEntityException – Jack

+0

,如果你在你的方法ErrorDetail返回類型? – RVP

回答

1

看來你已經添加了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將適用exception處理每一個controller.

,最重要的部分是你的方法應該序拋出異常爲@ExceptionHandler工作改變你的方法簽名。

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

謝謝,但是我現在的代碼在喚醒handleDuplicateEntityException方法。 – Jack

+0

改變了方法看看它。我刪除'@ResponseStatus(代碼= HttpStatus.CONFLICT)'從即使@ControllerAdvice方法 – Priyamal

+0

不幸的是相同的行爲。然而,我確實發現,這是一個錯誤,但3.0.1隨後被固定https://jira.spring.io/browse/SPR-6902 – Jack

0

嗯,我很尷尬通過代碼的問題,原來是在ErrorDetail類缺少默認構造函數:-(