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

奇怪的RESTfulJavaEE行为

牟波
2023-03-14

我正在Glassfish 4.1上制作一个Java EE 7应用程序(war)
该应用程序是一个简单的CRUD应用程序
为了测试CRUD操作,我制作了一个Java SE客户端(使用Jersey2客户端api)。奇怪的行为是HTTP POST创建没有检测到对象的一个字段:
我有一个“birthDate”属性,它在服务器端总是为“null”<我不明白为什么会发生这种情况以及如何解决?

以下是我在服务器端使用的依赖项:

    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>org.eclipse.persistence.core</artifactId>
        <version>2.6.0</version>
        <type>jar</type>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>

这是客户端依赖项:

    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.22</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.6.2</version>
    </dependency>

以下是客户端中的创建块:

    Client client = ClientBuilder.newClient();
    WebTarget webTarget = client.target("http://localhost:8080/MedicalCenter/rest/customers");

    Customer customer = new Customer("Jason", "Bourne", new Date(), "This is description", new ArrayList<Device>());

    ObjectMapper mapper = new ObjectMapper();

    String mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    result = mapper.writeValueAsString(customer);

    Response response = webTarget.request("application/json")
            .post(Entity.entity(result, MediaType.APPLICATION_JSON_TYPE));

这是一个已发送JSON的示例:

Here is an example {"id":null,
"name":"Jason",
"familyName":"Bourne",
"birthDate":"2015-10-05T21:41:43‌​.044+0000",
"description":"This is description",
"creation":"2015-10-05T21:41:43.044+0000",
"enabled":true,
"system":t‌​rue,
"version":null,
"devices":[]}

请帮帮我:)谢谢!!

共有1个答案

宋臻
2023-03-14

当超文本传输协议创建后通过泽西1.19客户端包时,情况变得更加奇怪。
因此,我得到确认,说这是服务器端的反序列化问题的假设是不正确的,因为它适用于泽西1.19客户端包。
我重新开始调查,比较了泽西1和泽西2客户端的JSON输出,发现区别在于出生日期的DateFormat:

  • Jeysey 2:“生日”:“1990-05-04T22:00:00.000 0000”

所以我尝试在Jersey 2客户端中强制使用DateFormat:

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
//Jackson Object Mapper
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(sdf);

这是五分之五有效的

调用此解决方案的下一个问题是,为什么唯一接受的格式是此格式?

希望此解决方法能帮助所有有相同问题的人!

 类似资料:
  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处

  • 问题内容: 为什么的到哪里去了? 问题答案: 删除任何字符,并从字符串的开头和结尾。

  • 问题内容: 我认为这是一个正常程序,但这是我得到的输出: 有人可以向我解释一下吗? 问题答案: 这是有据可查的PHP行为,请参阅php.net的foreach页面上的警告。 警告 即使在 foreach 循环之后,仍保留 $ value的 引用和最后一个数组元素。建议通过unset()销毁它。 __ 编辑 尝试逐步了解此处实际发生的情况

  • 问题内容: 我有上面的代码,但我不知道为什么会产生 而不是 非常感谢 问题答案: 使用量词来匹配1个或多个空格,而不是:- 表示匹配0个或多个空格,并且将在每个字符之前匹配一个空字符,并由一个空格代替。