Игнорировать заголовок Accept весной mvc - PullRequest
4 голосов
/ 25 марта 2011

У меня есть контроллер, который обслуживает файлы (изображения, PDF и т. Д.):

@Controller
public class FileController {

    @ResponseBody
    @RequestMapping("/{filename}")
    public Object download(@PathVariable String filename) throws Exception {
        returns MyFile.findFile(filename);
    }

}

Если я запрашиваю файл со следующим заголовком Accept, я получаю 406:

Request     
URL: http://localhost:8080/files/thmb_AA039258_204255d0.png
Request Method:GET
Status Code:406 Not Acceptable
Request Headers
Accept:*/*

Если я запрашиваю тот же файл со следующим заголовком Accept, я получаю 200:

URL: http://localhost:8080/files/thmb_AA039258_204255d0.png
Request Method: GET 
Status Code:200 OK
Request Headers
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

Это единственный распознаватель представлений в моем контексте spring-mvc:

<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" id="tilesViewResolver">
   <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>
</bean>

Есть ли способ настроить spring mvc на игнорирование заголовка Accept? Я видел пример этого с ContentNegotiatingViewResolver, но только для обработки XML и JSON.

Ответы [ 3 ]

5 голосов
/ 02 апреля 2011

Итак, вот код, который я использовал, чтобы заставить его работать:

@Controller
public class FileController {

    @ResponseBody
    @RequestMapping("/{filename}")
    public void download(@PathVariable String filename, ServletResponse response) throws Exception {
        MyFile file = MyFile.find(filename);
        response.setContentType(file.getContentType());
        response.getOutputStream().write(file.getBytes());

    }


}
0 голосов
/ 19 мая 2015

Я использовал это для привязки к типу ответа JSON:

@Configuration
@EnableWebMvc
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {

    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {

        configurer.favorPathExtension(false);
        configurer.ignoreAcceptHeader(true);
        configurer.defaultContentType(MediaType.APPLICATION_JSON);

    }

}

favorPathExtension(false) необходимо, потому что Spring по умолчанию (по крайней мере в 4.1.5) предпочитает согласование содержимого на основе пути (т. Е. ЕслиURL заканчивается на «.xml», он будет пытаться вернуть XML и т. Д.).

0 голосов
/ 25 марта 2011

Когда вы используете аннотацию ResponseBody, я думаю, что это часть сделки, когда он смотрит на заголовок Accept и пытается сделать какое-то отображение или что-то еще.Однако существует множество других способов отправить ответ, если вы не можете понять, как это сделать с этой аннотацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...