gpt4 book ai didi

java - HttpMediaTypeNotAcceptableException : Could not find acceptable representation in exceptionhandler

转载 作者:IT老高 更新时间:2023-10-28 13:56:01 31 4
gpt4 key购买 nike

我的 Controller 中有以下图片下载方法(Spring 4.1):

@RequestMapping(value = "/get/image/{id}/{fileName}", method=RequestMethod.GET)
public @ResponseBody byte[] showImageOnId(@PathVariable("id") String id, @PathVariable("fileName") String fileName) {
setContentType(fileName); //sets contenttype based on extention of file
return getImage(id, fileName);
}

以下ControllerAdvice方法应该处理一个不存在的文件并返回一个 json 错误响应:

@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public @ResponseBody Map<String, String> handleResourceNotFoundException(ResourceNotFoundException e) {
Map<String, String> errorMap = new HashMap<String, String>();
errorMap.put("error", e.getMessage());
return errorMap;
}

我的 JUnit 测试完美无缺

(EDIT这是因为扩展名.bla:这也适用于appserver):

@Test
public void testResourceNotFound() throws Exception {
String fileName = "bla.bla";
mvc.perform(MockMvcRequestBuilders.get("/get/image/bla/" + fileName)
.with(httpBasic("test", "test")))
.andDo(print())
.andExpect(jsonPath("$error").value(Matchers.startsWith("Resource not found")))
.andExpect(status().is(404));
}

并给出以下输出:

MockHttpServletResponse:
Status = 404
Error message = null
Headers = {X-Content-Type-Options=[nosniff], X-XSS-Protection=[1; mode=block], Cache-Control=[no-cache, no-store, max-age=0, must-revalidate], Pragma=[no-cache], Expires=[0], X-Frame-Options=[DENY], Content-Type=[application/json]}
Content type = application/json
Body = {"error":"Resource not found: bla/bla.bla"}
Forwarded URL = null
Redirected URL = null
Cookies = []

但是,在我的应用服务器上,当我尝试下载不存在的图像时收到以下错误消息:

(编辑这是因为扩展 .jpg :这在带有 .jpg 扩展的 JUnit 测试中也失败):

ERROR org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: public java.util.Map<java.lang.String, java.lang.String> nl.krocket.ocr.web.controller.ExceptionController.handleResourceNotFoundException(nl.krocket.ocr.web.backing.ResourceNotFoundException)
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

我在我的 mvc 配置中配置了 messageconverters,如下所示:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(mappingJackson2HttpMessageConverter());
converters.add(byteArrayHttpMessageConverter());
}

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//objectMapper.registerModule(new JSR310Module());
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(objectMapper);
converter.setSupportedMediaTypes(getJsonMediaTypes());
return converter;
}

@Bean
public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
ByteArrayHttpMessageConverter arrayHttpMessageConverter = new ByteArrayHttpMessageConverter();
arrayHttpMessageConverter.setSupportedMediaTypes(getImageMediaTypes());
return arrayHttpMessageConverter;
}

我错过了什么?为什么 JUnit 测试有效?

最佳答案

您需要决定 Spring 应如何确定响应的媒体类型。这可以通过多种方式完成:

  • 路径扩展名(例如/image.jpg)
  • 网址参数(例如 ?format=jpg)
  • HTTP Accept header (例如,Accept: image/jpg)

默认情况下,Spring 查看 extension 而不是 Accept header 。如果您实现扩展 WebMvcConfigurerAdapter@Configuration 类,则可以更改此行为。 (或者从 Spring 5.0 开始,只需实现 WebMvcConfigurer 。在那里您可以覆盖 configureContentNegotiation(ContentNegotiationConfigurer configurer) 并根据您的需要配置 ContentNegotiationConfigurer,例如,通过调用

ContentNegotiationConfigurer#favorParameter
ContentNegotiationConfigurer#favorPathExtension

如果您将两者都设置为 false,那么 Spring 将查看 Accept header 。由于您的客户端可以说 Accept: image/*,application/json 并处理两者,因此 Spring 应该能够返回图像或错误 JSON。

this Spring tutorial有关更多信息和示例的内容协商。

关于java - HttpMediaTypeNotAcceptableException : Could not find acceptable representation in exceptionhandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32351142/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com