在Restful Spring引导应用程序中的异常映射

在Restful Spring引导应用程序中的异常映射

问题描述:

我有一个自定义异常类,我想在发生异常时作为json返回。在Restful Spring引导应用程序中的异常映射

SpringCacheException.java

@JsonSerialize 
public class SpringCacheException extends Exception{ 
    private static final long serialVersionUID = 1L; 
    private HttpStatus status; 
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss") 
    private LocalDateTime timestamp; 
    private String message; 
    private String debugMessage; 
    public SpringCacheException(HttpStatus status, String message, String debugMessage) { 
     super(); 
     this.setStatus(status); 
     this.message = message; 
     this.debugMessage = debugMessage; 
    } 
    public SpringCacheException() { 
     timestamp = LocalDateTime.now(); 
    } 

    public SpringCacheException(HttpStatus status) { 
     this(); 
     this.setStatus(status); 
    } 

    public SpringCacheException(HttpStatus status, Throwable ex) { 
     this(); 
     this.setStatus(status); 
     this.setMessage("Unexpected error"); 
     this.setDebugMessage(ex.getLocalizedMessage()); 
    } 

    public SpringCacheException(HttpStatus status, String message, Throwable ex) { 
     this(); 
     this.setStatus(status); 
     this.setMessage(message); 
     this.setDebugMessage(ex.getLocalizedMessage()); 
    } 

    public String getMessage() { 
     return message; 
    } 

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

    public String getDebugMessage() { 
     return debugMessage; 
    } 

    public void setDebugMessage(String debugMessage) { 
     this.debugMessage = debugMessage; 
    } 
    public HttpStatus getStatus() { 
     return status; 
    } 
    public void setStatus(HttpStatus status) { 
     this.status = status; 
    } 
} 

RestExceptionHandler.java

@Order(Ordered.HIGHEST_PRECEDENCE) 
    @ControllerAdvice 
    public class RestExceptionHandler extends ResponseEntityExceptionHandler { 
     private static final Logger logger= LoggerFactory.getLogger(ContactServiceImpl.class); 

     @Override 
      protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { 
       SpringCacheException errorMessage = new SpringCacheException(status.BAD_REQUEST,"My Error",ex); 
       return new ResponseEntity<Object>(errorMessage, headers, status); 
      } 

@ExceptionHandler(SpringCacheException.class) 
     ResponseEntity<Object> handleBadRequests(HttpStatus status,String message,SpringCacheException ex) throws IOException { 
      SpringCacheException errorMessage = new SpringCacheException(HttpStatus.BAD_REQUEST,"My Error",ex); 
      return new ResponseEntity<Object>(errorMessage,HttpStatus.BAD_REQUEST); 
     } 
    } 

抛出异常: -

@Override 
    public Contact show(int id) throws SpringCacheException { 
     try { 
      Contact contact = contactRepository.findOneById(id); 
      return contact; 
     } 
     catch (Exception e) { 
      throw new SpringCacheException(); 
     } 
    } 

在这里我从数据库中删除联系人表并抛出异常,我得到了下面的长反应。

 Position: 111 
2017-10-22 00:37:08.577 WARN 10336 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Failed to invoke @ExceptionHandler method: org.springframework.http.ResponseEntity<java.lang.Object> com.myapp.exception.RestExceptionHandler.handleBadRequests(org.springframework.http.HttpStatus,java.lang.String,com.myapp.exception.SpringCacheException) throws java.io.IOException 

我只想要一个类型为SpringCacheException的json,但我得到这个长的json数据不正确。任何人都可以告诉我我做错了什么。谢谢 !

整个代码可以发现在 - https://github.com/iftekharkhan09/SpringCaching

+0

我想你可能有你的例外别的东西转化为传递到ResponseEntity构造 – Jeff

+0

@Jeff你能告诉我我需要做什么改变吗? –

你的异常处理程序方法需要SpringCacheException对象的单个参数(在其注释的类)。

@ExceptionHandler(SpringCacheException.class) 
     ResponseEntity<Object> handleBadRequests(SpringCacheException ex) throws IOException { 
      //SpringCacheException errorMessage = new SpringCacheException(HttpStatus.BAD_REQUEST,"My Error",ex); 
      return new ResponseEntity<Object>(ex, HttpStatus.BAD_REQUEST); 
     } 
    } 

顺便说一句,创建一个新的SpringCacheException会失败该处理程序的目的。你应该在传递异常返回方法

我分叉您的项目,在这里固定它:https://github.com/olantobi/SpringCaching