Json RPC 自定义对象在通过网络获取后为空
Json RPC Custom Object is null after getting it over network
我正在尝试构建两个可以使用 JSON RPC 通过网络相互交互的程序。
它目前适用于整数等原始类型,但自定义 Classes/Objects 总是返回 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;
}
这是尝试调用其他程序和 returns 自定义对象列表的方法。通过网络获取数据后,所有字段均为空。
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;
}
我不认为这些方法有什么问题,我的猜测是我在对象 class 本身中遗漏了一些东西,因为 Jackson 试图反序列化该对象而我遗漏了一个注释什么的。
@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 class,它位于一个单独的程序中并作为两个程序的依赖项安装。
我的问题是我是否遗漏了 ServiceInformation class 中的某些内容,因为在我通过网络传输它之前,所有字段都有值,而在传输之后所有字段都为空。
在尝试找出解决方案后,我将每个 LinkedList 更改为普通列表。这似乎解决了问题。
出于某种原因 Java 无法序列化 LinkedList。
我正在尝试构建两个可以使用 JSON RPC 通过网络相互交互的程序。
它目前适用于整数等原始类型,但自定义 Classes/Objects 总是返回 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;
}
这是尝试调用其他程序和 returns 自定义对象列表的方法。通过网络获取数据后,所有字段均为空。
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;
}
我不认为这些方法有什么问题,我的猜测是我在对象 class 本身中遗漏了一些东西,因为 Jackson 试图反序列化该对象而我遗漏了一个注释什么的。
@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 class,它位于一个单独的程序中并作为两个程序的依赖项安装。
我的问题是我是否遗漏了 ServiceInformation class 中的某些内容,因为在我通过网络传输它之前,所有字段都有值,而在传输之后所有字段都为空。
在尝试找出解决方案后,我将每个 LinkedList 更改为普通列表。这似乎解决了问题。
出于某种原因 Java 无法序列化 LinkedList。