将RestTemplate与JAXB注释一起使用:无法识别列表

将RestTemplate与JAXB注释一起使用:无法识别列表,jaxb,resttemplate,spring-resttemplate,Jaxb,Resttemplate,Spring Resttemplate,我在应用服务器项目(不是SpringBoot)中使用RestTemplate从端点获取实体 实体DTO(使用JAXB注释)是: 我正在使用RestTemplate执行到上一个端点的访问,代码如下: ... HttpEntity<EntityDTOO> response = restTemplate.exchange( uri, HttpMethod.GET, httpEntity, En

我在应用服务器项目(不是SpringBoot)中使用RestTemplate从端点获取实体

实体DTO(使用JAXB注释)是:

我正在使用RestTemplate执行到上一个端点的访问,代码如下:

...

HttpEntity<EntityDTOO> response = restTemplate.exchange(
            uri,
            HttpMethod.GET,
            httpEntity,
            EntityDTO.class);
...
但我期待着:

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();
        }
    }
}
我认为问题在于方法
restemplate.exchange
没有将
实体中的参数列表设置为
对象。您可能使用了该方法的不正确变体


我认为问题在于方法
restemplate.exchange
没有将
实体中的参数列表设置为
对象。您可能使用了该方法的不正确变体。

使用application/xml配置Accept标头。您将得到一个xml响应和一个带有application/xml的内容类型头。然后resttemplate将识别xml,而无需额外配置和使用bean注释。

使用application/xml配置Accept头。您将得到一个xml响应和一个带有application/xml的内容类型头。然后resttemplate将识别xml,而无需额外配置和使用bean注释。

我认为注释没有任何问题。是否确实要创建包含元素的列表?您可能没有正确构造对象。我确实在您的代码中发现了一些错误。我将编辑您的代码以更正它们。除非您提供更多代码,否则我无法继续。例如,您用来测试的URI是什么?您是如何创建http实体的?这些都是非常重要的部分,很可能是错误所在。正如我前面提到的,JAXB部分工作得很好。您可能需要创建一个
HttpMessageConverter
,它才能工作,除非您提供所有这些信息,否则我无法确定。我认为注释没有任何问题。是否确实要创建包含元素的列表?您可能没有正确构造对象。我确实在您的代码中发现了一些错误。我将编辑您的代码以更正它们。除非您提供更多代码,否则我无法继续。例如,您用来测试的URI是什么?您是如何创建http实体的?这些都是非常重要的部分,很可能是错误所在。正如我前面提到的,JAXB部分工作得很好。您可能需要创建一个
HttpMessageConverter
,它才能工作,除非您提供所有这些信息,否则我无法确定。
id: 1
parameterName: null
id: 1
parameterName: ["param1", "param2"]
@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();
        }
    }
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entity>
    <id>1</id>
    <parameterNames>
        <parameterName>param1</parameterName>
        <parameterName>param2</parameterName>
    </parameterNames>
</entity>