从产生xml MediaType的spring控制器抛出异常

时间:2015-02-23 13:53:02

标签: spring exception-handling

我有一个带有一个RequestMapping的控制器,它产生一个xml MediaType。

 @RestController
    @RequestMapping("/api")
    public class ArticleResource {

    @RequestMapping(value = "/xml/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
        public ResponseEntity<byte[]> getXml(@PathVariable(value = "id") String id,
                                              final HttpServletRequest request,
                                              final HttpServletResponse response) {
            InputStream inputStream = null;
            try {
                inputStream = new FileInputStream(path + id + ".xml");

            } catch (FileNotFoundException e) {
                throw new BadRequestException("No such xml exists");
            }
            try {
                return new ResponseEntity<byte[]>(IOUtils.toByteArray(inputStream), HttpStatus.OK);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return new ResponseEntity<byte[]>(HttpStatus.NOT_FOUND);
        }
    }

BadRequestException实现如下:

@ResponseStatus(value = HttpStatus.BAD_REQUEST)
public class BadRequestException extends RuntimeException {

    public BadRequestException(String message) {
        super(message);
    }

}

当xml存在时,它工作正常,但是当找不到xml时,我有406错误代码。我想问题出现是因为它需要一个xml媒体类型,而是返回一个RuntimeException。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您的HTTP请求中是否有Accept:标头?您的错误处理程序将只返回HTTP错误代码(响应状态),因此如果客户端需要XML,它将在客户端生成406 Not Acceptable。 如果是这种情况,您可以从错误处理程序返回XML响应实体并更新您的签名以反映它生成XML。或者,您可以尝试从请求中删除Accepts

答案 1 :(得分:0)

我通过返回以下内容解决了我的问题:

String returnString = "XML file don't exists";
return new ResponseEntity<byte[]>(IOUtils.toByteArray(
                        new ByteArrayInputStream(returnString.getBytes())), HttpStatus.NOT_FOUND);