简体   繁体   English

使用 RestTemplate 获取 XML 个对象的列表返回一个空列表

[英]Using RestTemplate to get a list of XML objects gives back an empty list

I'm wondering how, calling an external API service to get a list of object mapped by my class.我想知道如何调用外部 API 服务来获取由我的 class 映射的 object 的列表。

This is what the XML looks like这就是 XML 的样子

<ArrayOfObject>
    <Object>
        <id></id>
        <name></name>
        <var1></var1>
        <var2></var2>
        <var3></var3>
    </Object>
    <Object>
       <id></id>
       <name></name>
       <var1></var1>
       <var2></var2>
       <var3></var3>
   </Object>
  
   ...

</ArrayOfObject>

I'm trying to get only the id and name so i've tried to map in my class only theese two fields with @JsonIgnoreProperties annotation:我试图只获取 ID 和名称,所以我尝试在我的 class 中使用 map 只有这两个带有@JsonIgnoreProperties注释的字段:

@JsonIgnoreProperties
public class Object{
    public String id, name;
    
    public Object() {}
    public Object(String id, String name) {
        this.id = id;
        this.name= name;
    }


    public String getId() {return id;}
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {return name;}
    public void setName(String name) {
        this.name = name;
    }

and wrap it into并将其包裹成


public class ArrayOfObject {

    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Object> object;
    
    public ArrayOfObject () {
        object = new ArrayList<>();
    }

    
    public List<Object> getObjects() {return objects;}
    public void setObjects(List<Object> objects) {
    this.object = objects;
    }   
}

So now this is what my controller looks like所以现在这就是我的 controller 的样子

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping
public class RestCall {

    @GetMapping("/objects")
    public List<Object> getObject(){
        final String uri = "";
        
    RestTemplate rt = new RestTemplate();
        
    ArrayOfObject result = rt.getForObject(uri, ArrayOfObject.class);
    return result.getObjects();
    }
}

that's my pom.xml那是我的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>it.me</groupId>
    <artifactId>Reading-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Reading-test</name>
    <description>Service</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

I'm wondering why it gives back an empty list, am i missing something in the serialization or could be something else?我想知道为什么它会返回一个空列表,我是在序列化中遗漏了什么还是可能是其他东西?

It would be easier to use a for loop and adding those object to a list?使用 for 循环并将那些 object 添加到列表中会更容易吗? If it would how can i implement something like that?如果可以的话,我怎么能实现这样的东西呢?

This is part of a previous question but not a duplicate.这是上一个问题的一部分,但不是重复的。

Don't know if anybody cares but i've solved adding a few annotations and now looks like:不知道是否有人关心,但我已经解决了添加一些注释的问题,现在看起来像:

package it.me.model;

import java.io.Serializable;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

@JacksonXmlRootElement(localName = "Object")
public class Object implements Serializable{

    private static final long serialVersionUID = 1L;
    
    @JacksonXmlProperty
    private String id;
    
    @JacksonXmlProperty
    private String name;
    
    @JacksonXmlProperty
    private String var1;
    
    @JacksonXmlProperty
    private String var2;
    
    @JacksonXmlProperty
    private String var3;
    
    public Object() {}
    public Object(String id, String name, String var1, String var2, String var3) {
        this.id = id;
        this.name = name;
        this.var1= var1;
        this.var2= var2;
        this.var3= var3;
        
    }
    
    //getters n setters
    public static long getSerialversionuid() {return serialVersionUID;}
    
    
    //tostring, equals, hashcode overrides

}

That's the wrapper class:那是包装器 class:

package it.me.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

@JacksonXmlRootElement
public class ArrayOfObject implements Serializable{

    private static final long serialVersionUID = 1L;

    @JacksonXmlProperty(localName = "Object")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Object> ArrayOfObject = new ArrayList<>();

    public ArrayOfObject() {}
    public ArrayOfObject(List<Object> arrayOfObject) {
        ArrayOfObject = arrayOfObject;
        
    }
    
    public List<Object> getArrayOfObject() {return ArrayOfObject;}
    public void setArrayOfObject(List<Object> arrayOfObject) {
        ArrayOfObject = arrayOfObject;
        
    }
    public static long getSerialversionuid() {return serialVersionUID;}

}

In needed in my pom.xml thoose: (not sure about the 2nd one)在我的pom.xml中需要:(不确定第二个)

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
</dependency>

Finally that's the controller:最后是 controller:

package it.me.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import it.me.model.ArrayOfObject;

@RestController
@RequestMapping
public class Controller {
    
    @GetMapping("/objects")
    public ArrayOfObject getObjects(){

        final String uri = ""
        
        RestTemplate rt = new RestTemplate();
        
        ArrayOfObject result = rt.getForObject(uri, ArrayOfObject.class);
        return result;
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM