Spring MVC REST通过返回JSON处理错误的网址(404)

我正在使用SpringMVC开发REST服务,其中在类和方法级别使用@RequestMapping。

当前已将该应用程序配置为返回在web.xml中配置的错误页面jsp。

<error-page>

<error-code>404</error-code>

<location>/resourceNotFound</location>

</error-page>

但是,我想返回自定义JSON而不是此错误页面。

通过在控制器中编写此代码,我能够处理异常并为其他异常返回json,但不确定在URL根本不存在时如何以及在何处编写返回JSON的逻辑。

    @ExceptionHandler(TypeMismatchException.class)

@ResponseStatus(value=HttpStatus.NOT_FOUND)

@ResponseBody

public ResponseEntity<String> handleTypeMismatchException(HttpServletRequest req, TypeMismatchException ex) {

HttpHeaders headers = new HttpHeaders();

headers.add("Content-Type", "application/json; charset=utf-8");

Locale locale = LocaleContextHolder.getLocale();

String errorMessage = messageSource.getMessage("error.patient.bad.request", null, locale);

errorMessage += ex.getValue();

String errorURL = req.getRequestURL().toString();

ErrorInfo errorInfo = new ErrorInfo(errorURL, errorMessage);

return new ResponseEntity<String>(errorInfo.toJson(), headers, HttpStatus.BAD_REQUEST);

}

@ControllerAdvice

public class RestExceptionProcessor {

@Autowired

private MessageSource messageSource;

@ExceptionHandler(HttpRequestMethodNotSupportedException.class)

@ResponseStatus(value=HttpStatus.NOT_FOUND)

@ResponseBody

public ResponseEntity<String> requestMethodNotSupported(HttpServletRequest req, HttpRequestMethodNotSupportedException ex) {

Locale locale = LocaleContextHolder.getLocale();

String errorMessage = messageSource.getMessage("error.patient.bad.id", null, locale);

String errorURL = req.getRequestURL().toString();

ErrorInfo errorInfo = new ErrorInfo(errorURL, errorMessage);

return new ResponseEntity<String>(errorInfo.toJson(), HttpStatus.BAD_REQUEST);

}

@ExceptionHandler(NoSuchRequestHandlingMethodException.class)

@ResponseStatus(value=HttpStatus.NOT_FOUND)

@ResponseBody

public ResponseEntity<String> requestHandlingMethodNotSupported(HttpServletRequest req, NoSuchRequestHandlingMethodException ex) {

Locale locale = LocaleContextHolder.getLocale();

String errorMessage = messageSource.getMessage("error.patient.bad.id", null, locale);

String errorURL = req.getRequestURL().toString();

ErrorInfo errorInfo = new ErrorInfo(errorURL, errorMessage);

return new ResponseEntity<String>(errorInfo.toJson(), HttpStatus.BAD_REQUEST);

}

}

回答:

在SpringFramework中研究了DispatcherServlet和HttpServletBean.init()之后,我发现在Spring

4中它是可能的。

/** Throw a NoHandlerFoundException if no Handler was found to process this request? **/

private boolean throwExceptionIfNoHandlerFound = false;

protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {

if (pageNotFoundLogger.isWarnEnabled()) {

String requestUri = urlPathHelper.getRequestUri(request);

pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + requestUri +

"] in DispatcherServlet with name '" + getServletName() + "'");

}

if(throwExceptionIfNoHandlerFound) {

ServletServerHttpRequest req = new ServletServerHttpRequest(request);

throw new NoHandlerFoundException(req.getMethod().name(),

req.getServletRequest().getRequestURI(),req.getHeaders());

} else {

response.sendError(HttpServletResponse.SC_NOT_FOUND);

}

}

为false,我们应该在 *

<servlet>

<servlet-name>appServlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<param-name>throwExceptionIfNoHandlerFound</param-name>

<param-value>true</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

<async-supported>true</async-supported>

</servlet>

然后,您可以使用此方法将其捕获在带有 注释的类中。

@ExceptionHandler(NoHandlerFoundException.class)

@ResponseStatus(value=HttpStatus.NOT_FOUND)

@ResponseBody

public ResponseEntity<String> requestHandlingNoHandlerFound(HttpServletRequest req, NoHandlerFoundException ex) {

Locale locale = LocaleContextHolder.getLocale();

String errorMessage = messageSource.getMessage("error.bad.url", null, locale);

String errorURL = req.getRequestURL().toString();

ErrorInfo errorInfo = new ErrorInfo(errorURL, errorMessage);

return new ResponseEntity<String>(errorInfo.toJson(), HttpStatus.BAD_REQUEST);

}

这使我可以为不存在映射的错误URL返回JSON响应,而不是重定向到JSP页面:)

{"message":"URL does not exist","url":"http://localhost:8080/service/patientssd"}

以上是 Spring MVC REST通过返回JSON处理错误的网址(404) 的全部内容, 来源链接: utcz.com/qa/419018.html

回到顶部