@PathVariable fileName结果为406 Not Acceptable

时间:2018-02-20 23:38:52

标签: java spring spring-mvc spring-boot kotlin

我有一个像 fileName

这样的处理程序方法
@GetMapping(value = ["/test/{fileName:.+}"], produces = [(MediaType.APPLICATION_JSON_VALUE)])
fun getFile(@PathVariable fileName: String): ResponseEntity<Map<String, String>> {
    return ResponseEntity.ok(hashMapOf(Pair("fileName", fileName)))
}

我有一些奇怪的行为,即

  • /test/item-1.exx结果称为{"fileName": "item-1.exx"}
  • /test/item-1.855结果称为{"fileName": "item-1.855"}
  • /test/item-1.pn8结果称为{"fileName": "item-1.pn8"}

但如果我尝试使用有效扩展名调用该方法,我会 406 Not Acceptable

  • /test/item-1.png结果称为 406 Not Acceptable
  • /test/item-1.jpg结果称为 406 Not Acceptable
  • /test/item-1.exe结果称为 406 Not Acceptable

我得到以下异常

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

如何解决这个问题?我希望能够使用有效的扩展名调用该方法。

2 个答案:

答案 0 :(得分:1)

这是因为内容协商,只是尝试将Content-Type添加到请求标头,它应该解决此问题,或禁用内容协商。看看这个链接:https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc

答案 1 :(得分:0)

@Jaiwo99的回答让我暗示需要做些什么。这是我找到的解决方案。

解决方案1:配置ContentNegotiation

@Bean
public WebMvcConfigurerAdapter webMvcConfigurerAdapter() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
            configurer
                .useJaf(false)
                .defaultContentType(MediaType.APPLICATION_JSON);
        }
    };
}

解决方案2:编辑application.yml / application.properties

spring:
    mvc:
        media-types:
            png: application/json
            jpg: application/json
            jpeg: application/json