将 RestTemplate 与 JAXB 注释一起使用:无法识别列表
Using RestTemplate with JAXB annotations: list not recognized
我在应用程序服务器项目(不是 Spring 启动)中使用 RestTemplate 从端点获取实体。
实体 DTO(使用 JAXB 注释)是:
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "entity")
public class EntityDTO {
private Integer id; // this was missing
private List<String> parameterName; // parameter names
public EntityDTO() {
}
@XmlElementWrapper(name = "parameterNames")
@XmlElement(name = "parameterName")
public List<String> getParameterName() {
return parameterName;
}
public void setParameterName(List<String> parameterName) {
this.parameterName = parameterName;
}
@XmlElement(name = "id")
public Integer getId() {
return id;
}
// this was returning Integer instead of void
public void setId(Integer id) {
this.id = id;
}
}
因此在端点中实体以这种方式返回,例如:
{
"entity": {
"id": 1,
"parameterNames": {
"parameterName": [
"param1",
"param2"
]
}
}
}
我正在使用带有以下代码的 RestTemplate 对前一个端点执行 GET:
...
HttpEntity<EntityDTOO> response = restTemplate.exchange(
uri,
HttpMethod.GET,
httpEntity,
EntityDTO.class);
...
但是 RestTemplate 以这种方式解组实体:
id: 1
parameterName: null
但我期待:
id: 1
parameterName: ["param1", "param2"]
有人知道如何使用 RestTemplate 识别 @XmlElementWrapper(name = "parameterNames") 注释吗?
提前致谢。
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "entity")
public class EntityDTO {
private Integer id;
private List<String> parameterName; // parameter names
public EntityDTO() {
}
@XmlElementWrapper(name = "parameterNames")
@XmlElement(name = "parameterName")
public List<String> getParameterName() {
return parameterName;
}
public void setParameterName(List<String> parameterName) {
this.parameterName = parameterName;
}
@XmlElement(name = "id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public static void main(String[] args) {
try {
EntityDTO dto = new EntityDTO();
List<String> params = new ArrayList<>();
params.add("param1");
params.add("param2");
dto.setId(1);
dto.setParameterName(params);
JAXBContext jaxbContext = JAXBContext.newInstance(EntityDTO.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
StringWriter sw = new StringWriter();
jaxbMarshaller.marshal(dto, sw);
String xmlContent = sw.toString();
System.out.println(xmlContent);
} catch (Exception e) {
e.printStackTrace();
}
}
}
基本上,使用您的 EntityDTO
class 并将参数添加到 JAXB 对象,会产生预期的 XML.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entity>
<id>1</id>
<parameterNames>
<parameterName>param1</parameterName>
<parameterName>param2</parameterName>
</parameterNames>
</entity>
我认为问题在于方法 restTemplate.exchange
没有在 EntityDTO
对象中设置参数列表。您可能使用了该方法的错误变体。
使用 application/xml 配置接受 header。您将收到 xml 响应和内容类型 header 和 application/xml。然后 resttemplate 将识别 xml 而无需额外配置并使用 bean 注释。
我在应用程序服务器项目(不是 Spring 启动)中使用 RestTemplate 从端点获取实体。
实体 DTO(使用 JAXB 注释)是:
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "entity")
public class EntityDTO {
private Integer id; // this was missing
private List<String> parameterName; // parameter names
public EntityDTO() {
}
@XmlElementWrapper(name = "parameterNames")
@XmlElement(name = "parameterName")
public List<String> getParameterName() {
return parameterName;
}
public void setParameterName(List<String> parameterName) {
this.parameterName = parameterName;
}
@XmlElement(name = "id")
public Integer getId() {
return id;
}
// this was returning Integer instead of void
public void setId(Integer id) {
this.id = id;
}
}
因此在端点中实体以这种方式返回,例如:
{
"entity": {
"id": 1,
"parameterNames": {
"parameterName": [
"param1",
"param2"
]
}
}
}
我正在使用带有以下代码的 RestTemplate 对前一个端点执行 GET:
...
HttpEntity<EntityDTOO> response = restTemplate.exchange(
uri,
HttpMethod.GET,
httpEntity,
EntityDTO.class);
...
但是 RestTemplate 以这种方式解组实体:
id: 1
parameterName: null
但我期待:
id: 1
parameterName: ["param1", "param2"]
有人知道如何使用 RestTemplate 识别 @XmlElementWrapper(name = "parameterNames") 注释吗?
提前致谢。
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "entity")
public class EntityDTO {
private Integer id;
private List<String> parameterName; // parameter names
public EntityDTO() {
}
@XmlElementWrapper(name = "parameterNames")
@XmlElement(name = "parameterName")
public List<String> getParameterName() {
return parameterName;
}
public void setParameterName(List<String> parameterName) {
this.parameterName = parameterName;
}
@XmlElement(name = "id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public static void main(String[] args) {
try {
EntityDTO dto = new EntityDTO();
List<String> params = new ArrayList<>();
params.add("param1");
params.add("param2");
dto.setId(1);
dto.setParameterName(params);
JAXBContext jaxbContext = JAXBContext.newInstance(EntityDTO.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
StringWriter sw = new StringWriter();
jaxbMarshaller.marshal(dto, sw);
String xmlContent = sw.toString();
System.out.println(xmlContent);
} catch (Exception e) {
e.printStackTrace();
}
}
}
基本上,使用您的 EntityDTO
class 并将参数添加到 JAXB 对象,会产生预期的 XML.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entity>
<id>1</id>
<parameterNames>
<parameterName>param1</parameterName>
<parameterName>param2</parameterName>
</parameterNames>
</entity>
我认为问题在于方法 restTemplate.exchange
没有在 EntityDTO
对象中设置参数列表。您可能使用了该方法的错误变体。
使用 application/xml 配置接受 header。您将收到 xml 响应和内容类型 header 和 application/xml。然后 resttemplate 将识别 xml 而无需额外配置并使用 bean 注释。