2017-03-23 373 views
0

每当我的控制器抛出异常,它不会以json格式返回响应。@ControllerAdvice不返回json响应

这是给白色标签错误页面

This application has no explicit mapping for /error, so you are seeing this as a fallback. 

我的控制器:

@RequestMapping(value = GENERATE_IMAGE, method = RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE) 
public byte[] get(@PathVariable("input") String input) throws IOException { 
    if (true) { 
     throw new BusinessValidationFailureException("sdfsdfsd"); 
    } 
    ByteArrayInputStream inputStream = service.generate(input); 
    return ByteStreams.toByteArray(inputStream); 
} 

而且我的控制器的建议是:

@ControllerAdvice 
public class WickesGlobalExceptionMapper extends ResponseEntityExceptionHandler { 

    @ExceptionHandler(BusinessValidationFailureException.class) 
    @ResponseBody 
    public ResponseEntity handleBusinessException(BusinessValidationFailureException ex, WebRequest request) { 

     ErrorResource error = new ErrorResource("InvalidRequest", ex.getMessage(), null); 

     HttpHeaders headers = new HttpHeaders(); 
     headers.setContentType(MediaType.APPLICATION_JSON); 
     return handleExceptionInternal(ex, error, headers, HttpStatus.UNPROCESSABLE_ENTITY, request); 
    } 
} 

我尝试一些其他的可能性,但我得到了同一个错误页面。

我得到异常以下服务器:

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:259) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:203) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81) ~[spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:132) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:384) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:59) [spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:136) [spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:74) [spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
+0

我认为你的控制器建议是抛出异常。请添加日志。 – reos

回答

1

由于控制器产生MediaType.IMAGE_PNG_VALUE,controlleradvice也应该产生相同的介质类型。我从requestmapping中删除了产品,并在响应中设置了内容类型,并且它工作正常。

@RequestMapping(value = GENERATE_BARCODE, method = RequestMethod.GET) 
public ResponseEntity get(@PathVariable("input") String barcodeInput) throws IOException { 
    byte[] resonse = service.generate(barcodeInput); 

    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.IMAGE_PNG); 
    return new ResponseEntity(resonse, headers, HttpStatus.OK); 
} 
1

你没有表现出handleExceptionInternal方法实现,这确实返回一个对象?

编辑:我错了@RestControllerAdvice,将其从答案中删除。

让我们假设你想返回一个ErrorData类型的对象(这在你的文章中是不明确的)。所以,你可以使用:

@ExceptionHandler(BusinessValidationFailureException.class) 
@ResponseBody 
public ResponseEntity<ErrorData> handleBusinessException(BusinessValidationFailureException e) { 
    ErrorData errorData = createYourErrorData(); 
    return new ResponseEntity(errorData, HttpStatus.UNPROCESSABLE_ENTITY); 
} 

我只是想这一点,并在JSON数据对象得到了正确的stataus代码重新走到一起。

+1

使用RestControllerAdvice与ControllerAdvice和ResponseBody相同。这只是保存一行。功能明智,我怀疑它会有所作为。 – krmanish007