使用Spring REST的URL中的错误消息

时间:2014-04-12 19:23:03

标签: java spring rest spring-mvc spring-boot

我正在使用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 enter image description here 图2 enter image description here

其他助手类:

@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);
    }
}

2 个答案:

答案 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"并删除它,并且仍然按照我认为你想要的方式工作。如果这有用,请告诉我。