我正在使用Spring REST Web服务开发一个项目,我需要在发生异常/错误时显示优雅的错误消息。我按照本教程(http://www.javacodegeeks.com/2013/02/exception-handling-for-rest-with-spring-3-2.html)使用SpringREST进行异常处理。当没有异常/错误时,即以XML的形式,我得到正确的输出。发生异常时会出现问题。以下是代码库的一部分,如果我没有在
中传递testId,则会发生异常localhost:8080/test?testId=
该类以XML的形式输出响应,因此当发生异常时,它不会显示如下图1所示的错误消息,而是显示错误消息,如图2所示。如果我执行"查看页面源&# 34;,我得到了正确的异常消息(如图1所示)。但我直接需要异常消息。请问任何人,请提出解决方案吗?
@RequestMapping(value = "/test",
method = RequestMethod.GET,
produces = "application/xml")
public @ResponseBody String testResource(
@RequestParam(value="testId", required=true) String testId)
throws CustomRestException{
if (testId == null || testId.equals(""))
{
LOG.error( "testResource(): " + TestUtilsException.NULL_TEST_ID_ERROR_MSG );
//The error message is: The test Id is required and cannot be null or empty
throw new CustomRestException(TestUtilsException.NULL_TEST_ID_ERROR_MSG);
}
}
图1 图2
其他助手类:
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
public RestResponseEntityExceptionHandler() {
super();
}
@ExceptionHandler(value = { CustomRestException.class })
@ResponseBody
protected ResponseEntity<Object> handleNotFound(final RuntimeException ex, final WebRequest request) {
final String bodyOfResponse = ex.getMessage();
return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR, request);
}
}
public class CustomRestException extends RuntimeException {
public CustomRestException() {
super();
}
public CustomRestException(final String message, final Throwable cause) {
super(message, cause);
}
public CustomRestException(final String message) {
super(message);
}
public CustomRestException(final Throwable cause) {
super(cause);
}
}
答案 0 :(得分:1)
@ControllerAdvice
方法应该有效,尽管我认为不需要基类 - 你可以在Spring 4中使用@ExceptionHandler
但是你要回来了一个无法转换为Xml的响应体(它是一个普通的字符串),所以你得到一个空响应,可能是405而不是500.如果你想要一个Xml响应,你必须提供一个可以是转换(或者提供可以做到的HttpMessageConverter
)。
答案 1 :(得分:0)
考虑这样做。
public class BaseController {
@ExceptionHandler(value = { CustomRestException.class })
protected @ResponseBody ResponseEntity<ErrorResponse > handleNotFound(final RuntimeException ex, final WebRequest request) {
System.out.println("is executed in handler");
final String bodyOfResponse = ex.getMessage();
return new ResponseEntity<ErrorResponse >(new ErrorResponse (bodyOfResponse), null, HttpStatus.NOT_FOUND);
}
}
在您的控制器中执行此操作。
@Controller
public class HomeController extends BaseController {//Your code here}
创建这个类。
@XmlRootElement
public class ErrorResponse {
public String error;
}
最后在您的课程中添加以下代码
if (testId == null || testId.equals(""))
{
throw new CustomRestException("DD");
}
这将创建如下的XML响应。
此XML文件似乎没有任何关联的样式信息 用它。文档树如下所示。
<successResponse> <error>DD</error> </successResponse>
这将处理添加@ControllerAdvice所不需要的所有异常,这似乎需要添加自己的MessageConverters,这就是为什么答案没有转换为XML,我读到了here。
我添加了,生成= "application/xml"
并删除它,并且仍然按照我认为你想要的方式工作。如果这有用,请告诉我。