Согласующая сила пружинного Mime-типа в случае ошибки

У меня есть весенний сервис, генерирующий pdf, если вы вызываете этот сервис в браузере с расширением пути.pdf, все работает нормально в случае успеха.

Тем не менее, в случае ошибки я хотел бы вернуть ответ об ошибке json, как и для всех других моих служб.

К сожалению, Spring (версия 4.1.4) вызывает исключение org.springframework.web.HttpMediaTypeNotAcceptableException: не удалось найти приемлемое представление

Даже если я добавлю заголовок accept, указывающий, что pdf или json могут быть в порядке.

Я выполнил следующие тесты: 1. Запрос вызова myService/doc.pdf со стандартным заголовком согласия браузера. Результат: Исключение 2. Запрос вызова myService/doc.pdf с определенным приложением заголовка подтверждения /pdf; application/json Результат: Исключение 3. Запрос вызова myService / doc со стандартным заголовком согласия браузера json возвращается успешно в случае ошибки 4. Запрос вызова myService / doc с заголовком приема application/pdf;application/json json возвращается успешно в случае ошибки ошибка

Мне кажется, что в случае, если Spring использует расширение пути для определения типов пантомимы ответа, ТОЛЬКО этот тип пантомимы разрешен в ответе. Тем не менее, я думаю, что нет смысла возвращать PDF-документ в случае ошибки.

Кто-нибудь знает, могу ли я отменить согласование содержимого в этом случае в моем обработчике исключений. Говоря, я знаю, что pdf-файл mime-типа запрашивается в расширении URL-адреса, однако я должен вернуть json mime-типа.

Большое спасибо за вашу поддержку заранее.

- Фолькер

Мой конфиг согласования контента:

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="true" />
<property name="favorParameter" value="false" />
<property name="defaultContentType" value="application/json"/>
<property name="mediaTypes" >
    <value>
        json=application/json
        xml=application/xml
    </value>
</property>
</bean>

Мой ErrorHandler:

@ExceptionHandler(MyControlException.class)
@ResponseBody
public ResponseEntity<ErrorModel> handleMyExceptions(final MyControlException ex, final HttpServletRequest request,
    final HttpServletResponse res) {

    ResponseEntity<ErrorModel> response;
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    response =  new ResponseEntity<ErrorModel>(ex.getError(), headers, HttpStatus.valueOf(ex.getError().getErrorCode()));
    return response;
}

Трассировка стека исключений:

o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Failed to invoke   @ExceptionHandler method: public org.springframework.http.ResponseEntity<com.myapp.apps2Control.common.model.ErrorModel>  com.myapp.apps2Control.rest.controller.BaseApps2MceController.handleMyExceptions(com.myapp.apps2Control.common.MyControlException,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:134) ~[spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:144) ~[spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:71) ~[spring-web-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126) ~[spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:362) ~[spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:60) [spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:138) [spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1167) [spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1004) [spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955) [spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) [spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) [spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) [spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) [servlet-api.jar:na]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) [spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE]

0 ответов

Другие вопросы по тегам