当前位置: 首页 > 知识库问答 >
问题:

Spring 3.1.2带@ResponseBody的MVC@ExceptionHandler

乐正洲
2023-03-14

我正在尝试使用@ResponseBody实现SpringWebMVC@ExceptionHandler,以返回包含验证错误的对象。(此处记录了策略E)。

在Spring3.0。x、 自解决以来,有一个已确认的错误,它阻止了此功能正常工作。我使用的是Spring 3.1.2,不应该碰到它。

然而,我遇到了一个例外“找不到可接受的代表”。

例外情况如下:

[10/21/12 12:56:53:296 CDT] 00000045 ExceptionHand E redacted.loggi
ng.jdk14.LogWrapper error Failed to invoke @ExceptionHandler method: public 
redacted.model.view.ValidationErrorResponse redacted.controller.Re
stController.handleValidationException(redacted.util.ValidationExceptio
n,javax.servlet.http.HttpServletResponse)

Originating Class/Method:redacted.web.ui.filter.AccessControlFilter.pr
ocessFilter()

                                 org.springframework.web.HttpMediaTypeNotAccepta
bleException: Could not find acceptable representation
        at org.springframework.web.servlet.mvc.method.annotation.AbstractMessage
ConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMeth
odProcessor.java:115)

代码如下:

@ExceptionHandler(ValidationException.class)
@ResponseStatus(value = HttpStatus.PRECONDITION_FAILED)
@ResponseBody
public ValidationErrorResponse handleValidationException(ValidationException ex, HttpServletResponse response) {
    List<ValidationError> errs = new LinkedList<ValidationError>();
    for (ObjectError er : ex.getErrors()) {
        errs.add(new ValidationError(er.getObjectName(), er.getDefaultMessage()));
    }

    return new ValidationErrorResponse(errs);

}

@RequestMapping(value = "/search")
@ResponseBody
public SearchResult search(@Valid @ModelAttribute SearchRequest searchRequest, BindingResult bResult) {
    if (bResult.hasErrors()) {
        throw new ValidationException(bResult.getAllErrors());
    }
    return searchService.search(searchRequest);
}

有什么想法吗?

共有3个答案

闻人升
2023-03-14

问题似乎是Spring不知道如何将ValidationErrorResponse转换为,例如,它应该将其转换为JSON、XML或其他什么?尝试返回ResponseEntity,因为您可以直接控制内容类型。

protected ResponseEntity<ValidationErrorResponse> createResponseEntity(ValidationErrorResponse restApiError)
    {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

           // assuming your ValidationErrorResponse object has an http code stored in it
        HttpStatus responseStatus = HttpStatus.valueOf(restApiError.getHttpStatus());
        ResponseEntity<RestApiError> result = new ResponseEntity<>(restApiError, headers, responseStatus);
        return result;
    }

我在我的应用程序中使用了类似的东西,我还可以抛出一组RuntimeException,其中包含足够的信息,能够生成正确的错误响应。

法弘亮
2023-03-14

当我需要为以某个已知扩展名(如“/blah/blah.xml”)结尾的请求返回JSON错误响应时,我遇到了这个问题。在这种情况下,Spring支持基于扩展的表示匹配,而忽略Accept标头(最新的Spring 4.1.5也是如此)。

我使用以下命令来“锁定”JSON响应,无论请求是什么。

@Configuration
@EnableWebMvc
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(false);
        configurer.ignoreAcceptHeader(true);
        configurer.defaultContentType(MediaType.APPLICATION_JSON);
    }
}
淳于禄
2023-03-14

如果你正在读这篇文章,你可能会对我是如何做到这一点产生一些疑问。简而言之,我不知道。我恢复了代码并从这里重新实现(实际上是复制并粘贴了控制器位),它突然开始工作。

如果您使用的是Spring 3.1.2,@ExceptionHandler和@响应体确实有效。

我对最初为什么这不起作用的初步解释是,这可能是用户错误或我正在使用的(非常复杂,这个应用程序非常庞大)部署脚本中的错误。

 类似资料:
  • 我有一个带有conroller的Spring MVC web应用程序,如下所示: 在这一点上,一切都很好。我要做的是在列表转换为JSON之前,在控制器返回列表的地方拦截请求,并返回包含列表和搜索参数的映射。 现在,由于“不可变”控制器users ResponseBody,控制转到JacksonMessageConverter amd,响应从那里发出。我已经尝试了以下路径,但它们不起作用。 > 拦截

  • 在我们的应用程序中,我们使用JSON进行请求和响应。控制器方法用@RequestBody()注释。返回的对象,例如TransferResponse。我想从@ResponseBody中找到这个对象。我已经设置了一个拦截器postHandle方法: 那么如何在这个postHandle方法中获取JSON呢? 提前感谢GM

  • 我有一个方法可以在Spring MVC环境中处理特定类别的异常。metod(简化)实现如下 这很好,但是要返回不同的我必须创建一个新的处理方法。 是否可以在不更改返回类型的情况下,更改方法体内部的响应状态,而不是使用ResponseStatus注释? 如果没有,是否可以改变返回类型(也许我自己序列化异常类并将其作为字符串返回)来实现相同的结果?

  • 我有以下控制器: 我只找到了与mvc配置相关的部分:

  • 我将对象作为JSON字符串存储在数据库中。我想制作一个公开这些字符串的REST服务。然而,当我编写方法时,我返回的字符串中的引号被转义了。例如,我包含了一个返回字符串的方法,

  • 问题内容: 我在注释驱动的Spring MVC Java Web应用程序中运行在Jetty Web服务器上运行(当前在Maven Jetty插件中)。 我正在尝试使用一种仅返回String帮助文本的控制器方法来提供一些AJAX支持。资源采用UTF-8编码,字符串也采用UTF-8编码,但是我来自服务器的回复是 即使我的浏览器发送 我正在以某种方式使用spring的默认配置 我发现了将这个bean添加