Spring休息Json Web服务与异常处理程序

时间:2015-03-11 10:07:29

标签: java json spring rest spring-mvc

我收到了一个无条件的问题。我在Spring Json的基础上制作了我的REST服务。我的服务假设使用" Content-Type application / json"但每当我发出没有内容类型的请求时,它就会引发异常。

 org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/plain;charset=UTF-8' not supported

但是我使用@ExceptionHandler处理此异常,但是spring无法处理此异常,并且我的控件没有进入@ExceptionHandler方法。

请指教!我如何确保我的传入请求需要发送内容类型标题??

我想在@ExceptionHandler方法中捕获此异常,以便我可以发送包含错误代码的错误消息。

@RequestMapping(value = "/login", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON, method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<ReponseWrapper> login(@Valid LoginRequest loginRequest,
        BindingResult results,) {
    //any code
}



 @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
    @ResponseStatus(value = HttpStatus.UNSUPPORTED_MEDIA_TYPE)
    public @ResponseBody Map<String, Object> handleUnsupportedMediaTypeException(HttpMediaTypeNotSupportedException ex) throws IOException {
        Map<String, Object>  map = Maps.newHashMap();
        map.put("error", "Unsupported Media Type");
        map.put("cause", ex.getLocalizedMessage());
        map.put("supported", ex.getSupportedMediaTypes());
        return map;
    }

2 个答案:

答案 0 :(得分:0)

嗯,第一个问题是控制器方法上的@ExceptionHandler注释只处理控制器内抛出的异常;您在调用控制器方法之前会遇到异常,因此无法处理。

如果您遇到这样的情况,将会处理:

@Controller
public class TestController {

    @ResponseBody
    @RequestMapping(value = "/test", consumes = APPLICATION_JSON_VALUE, produces = 
        APPLICATION_JSON_VALUE)
    public ResponseEntity<ResponseWrapper> test(LoginRequest request)
        throws HttpMediaTypeNotSupportedException {
        throw new HttpMediaTypeNotSupportedException("");
    }

    @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
    @ResponseStatus(value = HttpStatus.UNSUPPORTED_MEDIA_TYPE)
    public @ResponseBody Map<String, Object> handleUnsupportedMediaTypeException(
        HttpMediaTypeNotSupportedException ex) throws IOException {
        Map<String, Object> map = Maps.newHashMap();
        map.put("error", "Unsupported Media Type");
        map.put("cause", ex.getLocalizedMessage());
        map.put("supported", ex.getSupportedMediaTypes());
        return map;
    }
}

我怀疑你必须扩展只处理HttpMediaTypeNotSupportedException类型的ExceptionHandlerExceptionResolver。或者参考this page,看看它是否有帮助。

另外,看看你是否可以使用更新版本的Spring。

答案 1 :(得分:-1)

@ExceptionHanlder注释无效,因为您的返回类型无效。返回类型可以是String,它被解释为视图名称或ModelAndView对象。