当前位置: 首页 > 知识库问答 >
问题:

Json RPC自定义对象通过网络获取后为空

何晗昱
2023-03-14

我正在尝试构建两个程序,它们可以使用JSON RPC通过网络相互交互。

它目前适用于整数等基本类型,但自定义类/对象总是以null返回。

这是从数据库中获取数据的方法。数据被正确收集,没有字段为空。

public LinkedList<ServiceInformation> getServiceInformations() {
    LinkedList<ServiceInformation> returnList = new LinkedList<>();

    try (Connection conn = DriverManager.getConnection("jdbc:h2:" + Main.config_db_location + ";AUTO_SERVER=TRUE",
            Main.config_db_username, Main.config_db_password)) {
        // read data from database
        PreparedStatement stmt = conn.prepareStatement("SELECT * FROM BCSTASKS_SERVICE");

        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {
            // Create a new ServiceInformation with the name and description
            ServiceInformation tempInformation = new ServiceInformation(rs.getString("TicketName"),
                    rs.getString("TicketDescription"), rs.getString("JTaskID"), rs.getBoolean("wasShown"));
            // Add the ServiceInformation to the list
            returnList.add(tempInformation);
        }

        stmt.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
    return returnList;
}

这是一个尝试调用其他程序并返回自定义对象列表的方法。通过网络获取数据后,所有字段都为空。

public static LinkedList<ServiceInformation> getServiceInformationsRPC() {
    LinkedList<ServiceInformation> returnList = new LinkedList<>();
    
    try {
        URL url = new URL(getAPIUrl());

        JsonRpcHttpClient client = new JsonRpcHttpClient(url);
        
        DatabaseService dbService = ProxyUtil.createClientProxy(Syncer.class.getClassLoader(), DatabaseService.class, client);
        
        returnList = dbService.getServiceInformations();

        return returnList;
    } catch (Throwable t) {
        Main.logger.error("Couldn't get service information");
        t.printStackTrace();
    }
    return returnList;
}

我不认为方法有什么问题,我的猜测是我在对象类本身中遗漏了一些东西,因为杰克逊试图对对象进行反序列化,我遗漏了一个注释或其他东西。

@JsonIgnoreProperties(ignoreUnknown = true)
public class ServiceInformation {
/** The name of the ticket */
@JsonProperty("TicketName")
private final String TicketName;

/** The description of the ticket */
@JsonProperty("TicketDescription")
private final String TicketDescription;

/** The JTaskID of the ticket */
@JsonProperty("JTaskID")
private final String JTaskID;

/** Boolean to see if the ticket was already shown as a notification */
@JsonProperty("WasShown")
private boolean WasShown;

/**
 * Class that defines a ServiceInformation/Ticket.
 * 
 * @param TicketName        is the name of the ticket.
 * @param TicketDescription is a more detailed description of the problem.
 * @param JTaskID
 * @param WasShown
 */
@JsonCreator
public ServiceInformation(@JsonProperty("TicketName") String TicketName,
        @JsonProperty("TicketDescription") String TicketDescription, @JsonProperty("JTaskID") String JTaskID,
        @JsonProperty("WasShown") boolean WasShown) {
    this.TicketName = TicketName;
    this.TicketDescription = TicketDescription;
    this.WasShown = WasShown;
    this.JTaskID = JTaskID;
}

/**
 * Get the ticket name.
 * 
 * @return {@link #TicketName}
 */
@JsonProperty("TicketName")
public String getTicketName() {
    return TicketName;
}

/**
 * Get the ticket description.
 * 
 * @return {@link #TicketDescription}
 */
@JsonProperty("TicketDescription")
public String getDescription() {
    return TicketDescription;
}

/**
 * Get the tickets JTaskID
 * 
 * @return {@link #JTaskID}
 */
@JsonProperty("JTaskID")
public String getJTaskID() {
    return JTaskID;
}

/**
 * Get the value of {@code WasShown}
 * 
 * @return {@link #WasShown}
 */
@JsonProperty("WasShown")
public boolean getWasShown() {
    return WasShown;
}
}

两个程序都使用相同的ServiceInformation类,该类位于单独的程序中,并作为依赖项安装在两个程序中。

我的问题是,如果我在ServiceInformation类中遗漏了什么,因为在我通过网络传输之前,所有字段都有值,而在传输之后,所有字段都是空的。

共有1个答案

戚宏浚
2023-03-14

在试图找出一个解决方案后,我把每个LinkedList都变成了一个普通的列表。这似乎解决了问题。

不管出于什么原因,Java都无法序列化LinkedList。

 类似资料:
  • 我阅读了有关通过网络发送序列化对象的好处的文章。性能和尺寸成本。 有些解释了DataContract和使用JSON或XML序列化。 但是我找不到关于如果我不使用这些属性会发生什么的文章,并且我返回一个对象,假设我的对象的属性和状态是基本类型。显然,当我具体使用DataContractJsonSerializer之类的序列化程序及其WriteObject方法时,它会抛出一个异常。 例如,如果我在We

  • 问题内容: 我有一个JSON文件,其中包含一些我想在AngularJS网站上访问的数据。现在,我要从数组中仅获取一个对象。因此,我想例如ID为1的商品。 数据如下所示: 我想使用AngularJS $ http功能加载数据,如下所示: 这正在工作。但是,现在如何从获取的数组中获取特定的数据对象(按ID)呢? 在此先感谢您的帮助。 马克·马克 问题答案: 唯一的方法就是遍历数组。显然,如果您确定结果

  • 问题内容: 我应该使用什么图书馆?有什么功能对我有帮助? 问题答案: 最简单的方法可能是使用序列化。因此,您的对象类必须实现可序列化,因此必须具有所有成员(primitves和大多数标准Java类已经做到了)。这允许在运行时在对象实例和字节流之间进行映射。 您还需要用于Transer的协议。如果您不想处理流传输中的字节流,可以看看RMI,尽管这并不困难。但是,使用RMI可以使您以后构建功能更强大的

  • 4.4. 通过 getattr 获取对象引用 4.4.1. 用于模块的 getattr 4.4.2. getattr 作为一个分发者 你已经知道 Python 函数是对象。 你不知道的是,使用 getattr 函数,可以得到一个直到运行时才知道名称的函数的引用。 例 4.10. getattr 介绍 >>> li = ["Larry", "Curly"] >>> li.pop

  • 我有一个这样的用例。我在Mongo DB中有问题,有CRUD微服务。在那里,我公开了一个API方法,通过查询参数提供的ID列表获取问题。比如说,为了简单起见,用户会提出一些问题?id=2,id=7,id=4,id=5 然后我需要按照同样的顺序返回问题列表,如下所示 但是请注意,这既不是ASC也不是DESC,而是可以是任何任意顺序,例如 我正在使用org。springframework。数据mong

  • 我有两个表1)krs_question_bank 2)krs_options 而我正在调用Session.Save(问题)。生成了Hibernate查询,但..我有以下错误。有什么办法可以解决这个错误吗?