spring - Spring Boot REST 中的自定义媒体类型导致 HttpMediaTypeNotSupportedException

标签 spring spring-boot http-post spring-restcontroller media-type

我使用 Spring Boot 1.5.2,我有一个简单的 REST Controller ,如下所示,

@RestController
@RequestMapping
public class UserJWTController {

    @Inject
    private TokenProvider tokenProvider;

    @Inject
    private AuthenticationManager authenticationManager;

    @PostMapping(value = "/authenticate", produces = Version.V1_JSON_VALUE, consumes = Version.V1_JSON_VALUE)
    public ResponseEntity<?> authenticate(final @RequestBody LoginVM loginVM, HttpServletResponse response) {
    }
}

常数,

public final class Constants {
    // API versioning
    public static final String API_VERSION_MEDIA_TYPE = "application/vnd.test.onboarding";
    public static final String JSON_MIME_TYPE = "json";

    private Constants() {
    }
}

版本,

public class Version {
    // All versions defined here
    public static final String V1_JSON_VALUE = Constants.API_VERSION_MEDIA_TYPE + ".v1+" + Constants.JSON_MIME_TYPE;
    public static final MediaType V1_JSON = MediaType.valueOf(V1_JSON_VALUE);
    public static final String V2_JSON_VALUE = Constants.API_VERSION_MEDIA_TYPE + ".v2+" + Constants.JSON_MIME_TYPE;
    public static final MediaType V2_JSON = MediaType.valueOf(V2_JSON_VALUE);
}

但是,这似乎引发了以下错误,

WARN 37805 --- [  XNIO-2 task-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/vnd.test.onboarding.1.0+json' not supported

我正在使用的 Curl,

curl -X POST "http://localhost:8080/api/authenticate" -H "Accepts: application/vnd.test.onboarding.1.0+json" -H "Content-Type: application/vnd.test.onboarding.1.0+json" -d '{"usernme":"test", "password":"password"}'

{
  "status" : 415,
  "error" : "Unsupported Media Type",
  "exception" : "org.springframework.web.HttpMediaTypeNotSupportedException",
  "message" : "Unsupported Media Type",
  "path" : "/api/authenticate"
}

我不确定为什么自定义媒体类型会导致 HttpMediaTypeNotSupportedException。本来以为 Spring Boot 应该能够自动处理这个问题。

已更新

消息转换器已注册,

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
    jsonConverter.setSupportedMediaTypes(Arrays.asList(Version.V1_JSON));
    jsonConverter.setSupportedMediaTypes(Arrays.asList(Version.V2_JSON));
    return jsonConverter;
}

最佳答案

不知道我是如何错过这个的,但事实证明我请求的版本和 Accept header 不正确。

应该是

curl -X POST "http://localhost:8080/api/authenticate" -H "Accept: application/vnd.test.onboarding.1v+json" -H "Content-Type: application/vnd.test.onboarding.1v+json" -d '{"usernme":"test", "password":"password"}'

我还必须指定内容协商如下,

@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(true)
            .favorParameter(false)
            .ignoreAcceptHeader(false)
            .useJaf(false)
            .defaultContentType(MediaType.APPLICATION_JSON);
}

而且我不需要mappingJackson2HttpMessageConverter

关于spring - Spring Boot REST 中的自定义媒体类型导致 HttpMediaTypeNotSupportedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42986002/

相关文章:

java - 使用 Spring KeyGenerator 生成唯一的缓存 key 不起作用

Java Spring 表单标签问题

java - Spring Boot、安全登录无限查询

java - 迁移到 Spring Boot 2.0 后应用程序上下文监听器不起作用

http - 从列表中替换 HTTP POST URL 中的变量

security - HTTP POST 容易改变吗?

java - 如何使用 Spring MVC 在 JSP 中包含 js 和 CSS

java - 如何在 HTTP 请求中发送对象

spring-boot - 包含的重定向 URI 无效

java - 如何构建在 HttpPost 中使用的 JSONobject 请求