Bizzare问题与Java时间戳

时间:2018-04-23 19:57:06

标签: java json spring

我正在开发一个将对象发送到服务器进行处理的应用程序。该对象使用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;
}

但这是我的问题 - 当我在客户端调用端点的位置放置断点时,日期是正确的。

enter image description here

但是,当日期进入服务器端点时,日期非常不正确

enter image description here

TransactionParameters bean中的所有其他变量都是正确的。我还使用SOAP UI复制了这个调用,以排除客户端的任何问题,问题仍然存在。

有人可以提出任何建议吗?

提前感谢您的帮助。

3 个答案:

答案 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,所以我只能给你一般的指示,但这确实看起来像是一个反序列化问题。

需要考虑的一般事项:

  1. 确保服务器和客户端具有相同的序列化/反序列化设置。

  2. 确保他们运行相同版本的Spring REST和Jackson。

  3. 设置JVM arg -Djavax.net.debug=all并再次运行以查看真正正在发送/接收的内容。

  4. 作为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