我有一个带有一个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。我该如何解决这个问题?
答案 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);