0

アプリケーション サーバー プロジェクト (Spring Boot ではない) で 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") アノテーションを認識する方法を知っている人はいますか?

前もって感謝します。

4

2 に答える 2

0
@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クラスを使用してパラメーターを 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ます。おそらく、そのメソッドの間違ったバリアントを使用しています。

于 2021-04-22T19:20:20.013 に答える