我正在开发一个将对象发送到服务器进行处理的应用程序。该对象使用Spring以JSON格式发送。
我的问题是所有字段都正确传递 - 除了Date变量。它们显示为一个完全不同的价值,我很难过为什么。
以下是传递的对象的缩写版本:
public class TransactionParameters {
public Date startDate;
public Date endDate;
public List<String> transactionCodes;
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public List<String> getTransactionCodes() {
return transactionCodes;
}
public void setTransactionCodes(List<String> transactionCodes) {
this.transactionCodes = transactionCodes;
}
}
这是创建的JSON:
{"transactionCodes":["195"],"startDate":1524456000000,"endDate":1524456000000}
以下是客户端代码:
String responseString =
restTemplate.postForObject("http://localhost:9080/app/transaction"
+ "testUser123", transactionParameters, String.class);
这是服务器代码:
@ApiOperation(value="Get Transactions for Customer")
@POST
@Produces({ MediaType.APPLICATION_JSON })
@Consumes(MediaType.APPLICATION_JSON)
@Path("/customerAccountTransactions/{customerCode: [a-zA-Z0-9]+}")
@RequestMapping(value ="/transaction/{customerCode: [a-zA-Z0-9]+}", method=RequestMethod.POST, produces=MediaType.APPLICATION_JSON, consumes=MediaType.APPLICATION_JSON)
@ApiImplicitParams(@ApiImplicitParam(name = AUTHORIZATION, value = AUTHORIZATION, required = true, dataType = STRING, paramType = HEADER))
public Response getAccountTransactionsForCustomer(@PathVariable(CUSTOMER_CODE) @PathParam(CUSTOMER_CODE) final String customerCode, TransactionParameters transactionParameters) throws IntegrationException {
LOGGER.info("getAccountTransactionsForCustomer()");
Response response = null;
try {
final AccountTransactionsBean atb = getTransactions(customerCode, transactionParameters)
response = ResponseBuilder.buildSuccessResponse(atb);
} catch (final NotAuthorizedException nae) {
response = ResponseBuilder.buildNotAuthorizedResponse();
}
return response;
}
但这是我的问题 - 当我在客户端调用端点的位置放置断点时,日期是正确的。
但是,当日期进入服务器端点时,日期非常不正确。
TransactionParameters bean中的所有其他变量都是正确的。我还使用SOAP UI复制了这个调用,以排除客户端的任何问题,问题仍然存在。
有人可以提出任何建议吗?
提前感谢您的帮助。
答案 0 :(得分:2)
此问题的原因是Date和String是两种不同的数据类型。当您将Object转换为JSON时,它会直接将日期转换为String,并在该过程中失去其本质。
为了解决这个问题,您需要告诉代码这些特定字段是日期,因此需要保留原样。您可以通过在POJO中使用注释来实现:
示例:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss.SSSZ")
private Date changeTimestamp;
您可以使用上述语法,然后根据需要更改模式。
答案 1 :(得分:1)
免责声明当然我不太了解Spring REST,所以我只能给你一般的指示,但这确实看起来像是一个反序列化问题。
需要考虑的一般事项:
确保服务器和客户端具有相同的序列化/反序列化设置。
确保他们运行相同版本的Spring REST和Jackson。
设置JVM arg -Djavax.net.debug=all
并再次运行以查看真正正在发送/接收的内容。
作为Spring REST,它使用了杰克逊的权利吗?
尝试明确注释日期,看看是否有帮助:
public class TransactionParameters {
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
public Date startDate;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
public Date endDate;
// ...
}
答案 2 :(得分:0)
您可能需要添加或删除毫秒才能使转换正常工作。 000