我有两个 REST API,其中一个是返回由 xsd 文件生成的响应对象,另一个是请求该对象。
生成类的示例:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AlternateNumberEntry21", propOrder = {
"phoneNumber",
"extension",
"ringPattern",
"description"
})
public class AlternateNumberEntry21 {
@XmlElementRef(name = "phoneNumber", type = JAXBElement.class, required = false)
protected JAXBElement<String> phoneNumber;
@XmlElementRef(name = "extension", type = JAXBElement.class, required = false)
protected JAXBElement<String> extension;
@XmlElementRef(name = "ringPattern", type = JAXBElement.class, required = false)
protected JAXBElement<RingPattern> ringPattern;
@XmlElementRef(name = "description", type = JAXBElement.class, required = false)
protected JAXBElement<String> description;
}
第二个 API 通过 RestTemplate 从第一个 API 调用端点。
restTemplate.exchange(url, HttpMethod.GET, entity, AlternateNumberEntry21.class);
以及返回生成对象的第一个API的控制器方法:
@GetMapping("/alternate-numbers")
public ResponseEntity<AlternateNumberEntry21> getAlternateNumbers(@PathVariable String userId) {
return ResponseEntity.ok(incomingCallService.getAlternateNumbers(userId));
}
不幸的是,我收到了这个错误:
org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class javax.xml.bind.JAXBElement]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `javax.xml.bind.JAXBElement` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
我尝试使用 JAXBElement mixin 制作自定义 ObjectMapper,但它没有帮助。
@Configuration
public class CoreConfig {
@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(JAXBElement.class, JAXBElementMixIn.class);
return objectMapper;
}
}
@Slf4j
public abstract class JAXBElementMixIn<T> {
@JsonCreator
public JAXBElementMixIn(@JsonProperty("name") QName name,
@JsonProperty("declaredType") Class<T> declaredType,
@JsonProperty("scope") Class scope,
@JsonProperty("value") T value) {
log.debug("name {} value {}", name, value);
}
}
有没有办法将它正确反序列化为相同的类型类?