即使添加了在其他解决方案中在线找到的所有代码之后,标题中也出现了异常(我已经添加了HttpMessageConverters
和APPLICATION_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>
答案 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注释,以指示要绑定的属性的名称
答案 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环境中带注释的处理程序方法。