没有适合内容类型application / json的HttpMessageConverter; charset = UTF-8

时间:2019-05-22 23:00:27

标签: spring-boot jackson resttemplate

即使添加了在其他解决方案中在线找到的所有代码之后,标题中也出现了异常(我已经添加了HttpMessageConvertersAPPLICATION_JSON接受标头。)

public MyObject myMethod(String arg) {
    String uri = BASE_URI + "/var?arg=" + arg;

    restTemplate.setMessageConverters(getMessageConverters());

    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    HttpEntity<String> entity = new HttpEntity<>(headers);

    ResponseEntity<MyObject> response = restTemplate.exchange(uri, HttpMethod.GET, entity, MyObject.class);
    MyObject resource = response.getBody();

    return resource;

}

private List<HttpMessageConverter<?>> getMessageConverters() {
    List<HttpMessageConverter<?>> converters =
            new ArrayList<>();
    converters.add(new MappingJackson2HttpMessageConverter());
    converters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
    return converters;
}

MyObject:

public class MyObject {

    private String test;
    //more fields

    @JsonCreator
    public CandealQuote(String test) { //more args
        this.test = test;
        //more assignments
    }

有人知道吗?

编辑:pom.xml中的相关依赖项

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.8</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

2 个答案:

答案 0 :(得分:0)

请注意,要使HttpMessageConverter有资格进行映射,它的canRead方法必须返回true。

对于AbstractJackson2HttpMessageConverter(MappingJackson2HttpMessageConverter的父级),它不仅检查MediaType,还检查Jackson是否可以反序列化对象。

@Override
public boolean canRead(Type type, @Nullable Class<?> contextClass, @Nullable MediaType mediaType) {
    if (!canRead(mediaType)) {
        return false;
    }
    JavaType javaType = getJavaType(type, contextClass);
    AtomicReference<Throwable> causeRef = new AtomicReference<>();
    if (this.objectMapper.canDeserialize(javaType, causeRef)) {
        return true;
    }
    logWarningIfNecessary(javaType, causeRef.get());
    return false;
}

现在,我相信您的JsonCreator不正确。

  

注意:注释创建者方法(构造函数,工厂方法)时,方法必须为:

     
      
  • 不带JsonProperty注释的单参数构造函数/工厂方法:如果是这样,则这就是所谓的“委托创建者”,在这种情况下,Jackson首先将JSON绑定到参数的类型中,然后调用creator。这通常与JsonValue(用于序列化)结合使用。
  •   
  • 构造函数/工厂方法,其中每个参数都用JsonProperty或JacksonInject注释,以指示要绑定的属性的名称
  •   

另请参阅Why when a constructor is annotated with @JsonCreator, its arguments must be annotated with @JsonProperty?

答案 1 :(得分:0)

默认情况下,spring或springboot在启动期间配置以下消息转换器:

ByteArrayHttpMessageConverter – converts byte arrays
StringHttpMessageConverter – converts Strings
ResourceHttpMessageConverter – converts org.springframework.core.io.Resource for any type of octet stream
SourceHttpMessageConverter – converts javax.xml.transform.Source
FormHttpMessageConverter – converts form data to/from a MultiValueMap<String, String>.
Jaxb2RootElementHttpMessageConverter – converts Java objects to/from XML
MappingJackson2HttpMessageConverter – converts JSON
MappingJacksonHttpMessageConverter – converts JSON
AtomFeedHttpMessageConverter – converts Atom feeds 
RssChannelHttpMessageConverter – converts RSS feeds

但是要添加Jackson转换器,spring必须检测到 jackson 存在于类路径中,因此,通过向您的应用程序添加jackson依赖关系,应该自动配置转换器,除非您通过使用@EnableWebMVC注释明确阻止自动配置。

此外,请确保如果您使用的是其他端点,则该方法将正确注释,即对类使用@RestController,否则必须提供@ResponseBody注释以指示spring它是一个休息端点。

从文档中:

  

指示方法参数的注释应绑定到Web请求的正文。请求的正文通过   HttpMessageConverter解析方法参数,具体取决于   请求的内容类型。可以选择自动验证   通过用@Valid注释自变量来应用。支持的   Servlet环境中带注释的处理程序方法。