2015-01-24 13 views
2

Я создал это отображение REST, так что он может принимать имена файлов в конце URI ...весной ошибка requestmapping HTTP 406 расширения файла

@RequestMapping(value="/effectrequest/{name}/{imagename:[a-zA-Z0-9%\\.]*}", 
     headers="Accept=*/*", method=RequestMethod.GET, 
     produces = "application/json") 
public @ResponseBody EffectRequest effectRequest(
     @PathVariable("name") String name, 
     @PathVariable("imagename") String imageName) 
{ 
    return new EffectRequest(2, "result"); 
}  

который возвращает содержимое JSON с помощью MappingJackson2HttpMessageConverter. Я делаю тест JQuery AJAX вызов этого отображения с ...

var effectName = 'Blur'; 
var imageName = 'Blah.jpg'; 
var requestUri = '/effectrequest/' + effectName + '/' + imageName; 
alert(requestUri); 

$(document).ready(function() { 
$.ajax({ 
     url: /*[+ [[${hostname}]] + requestUri +]*/ 
    }).then(function(data) { 
     $('.effect').append(data.id); 
     $('.image').append(data.content); 
    }); 
}); 

Это создает URI из http://localhost/effectrequest/Blur/Blah.jpg и в сеансе отладки имя файла правильно принятого в методе effectRequest() выше. Однако клиент или jQuery AJAX-вызов получает ошибку HTTP 406 (недопустимо) с сервера, даже с produces = "application/json" в RequestMapping.

После долгих отладочных работ, у меня это сужение - когда я изменяю тестовый код javascript для создания URI http://localhost/effectrequest/Blur/Blah.json, он работает. Таким образом, либо Tomcat, либо MappingJackson2HttpMessageConverter вызывают ошибку HTTP 406, просматривая расширение имени файла в конце URI и решая, что содержимое JSON, которое я отправляю обратно, не является хорошим совпадением.

Можно ли переопределить это поведение без необходимости кодирования. (точка) в имени файла?

+0

Кроме того, я попробовал принудительный URIEncode в имени файла, заменив. (точка) с% 2E. RequestMapping правильно декодирует имя файла, но я все равно получаю сообщение об ошибке HTTP 406 при отправке JSON. Поэтому я могу заставить кодировать. (точка) каким-либо другим способом, если нет способа изменить конфигурацию по умолчанию в этом приложении Spring Boot? –

ответ

7

По умолчанию Spring MVC предпочитает использовать путь запроса, когда он пытается определить тип носителя для ответа на запрос. Это описано в javadoc for ContentNegotiationConfigurer.favorPathExtension():

Укажите, следует ли использовать расширение пути запроса, чтобы определить требуемый тип носителя с наивысшим приоритетом.

По умолчанию это значение равно true, и в этом случае запрос для /hotels.pdf будет интерпретироваться как запрос для "application/pdf" независимо от заголовка Accept.

В вашем случае это означает, что запрос /effectrequest/Blur/Blah.jpg интерпретируется как запрос image/jpeg, который оставляет MappingJackson2HttpMessageConveter пытается написать image/jpeg ответ, который он не в состоянии сделать.

Вы можете легко изменить эту конфигурацию, используя ContentNegotiationConfigurer, доступ к которой осуществляется путем расширения WebMvcConfigurerAdapter. Например:

@SpringBootApplication 
public class Application extends WebMvcConfigurerAdapter { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @Override 
    public void configureContentNegotiation(
      ContentNegotiationConfigurer configurer) { 
     configurer.favorPathExtension(false); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^