gpt4 book ai didi

java - 如何将 Java 日历对象的 JSON 表示传递给 REST 服务?

转载 作者:行者123 更新时间:2023-11-30 06:59:53 25 4
gpt4 key购买 nike

这是我的问题的简化版本。考虑以下 REST 服务...

@Stateless
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/test")
public class TestResource {


@POST
public Response test(Calendar c) {
System.out.println(c);
return Response.ok(Response.Status.OK).build();
}

@GET
@Path("/getCalendar")
public Response getCalendar() {
return Response.ok(toJSONString(Calendar.getInstance())).build();
}

public String toJSONString(Object object) {
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("yyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Gson gson = builder.create();
return gson.toJson(object);
}
}

当然,这...

@ApplicationPath("/rest")
public class RestActivator extends Application {

}

我正在使用 Postman,起初我通过向“http://localhost:8080/ProjectName/rest/test/getCalendar”发送 GET 请求来获得日历对象的 JSON 表示形式。 '.然后我复制返回的 JSON

{
"year": 2015,
"month": 5,
"dayOfMonth": 29,
"hourOfDay": 10,
"minute": 7,
"second": 24
}

然后使用 Postman 我将 POST 发送到 ' http://localhost:8080/ProjectName/rest/ ' 上面返回给我的数据。然后抛出“javax.ws.rs.NotSupportedException:无法使用内容类型”。

我该如何解决这个问题,以便服务可以处理 Calendar 对象(以及将 Calendar 对象作为字段的类)?

编辑:

是的,我正在设置正确的内容类型,即 application/json。

这是我得到的回应...

com.fasterxml.jackson.databind.JsonMappingException:无法从 START_OBJECT token 中反序列化 java.util.Calendar 的实例 在[来源:io.undertow.servlet.spec.ServletInputStreamImpl@4cf87599;行:1,列:1]

更新:为了让它发挥作用,我使用了@peeskillets 解决方案。

最佳答案

Jackson 通常只使用 JavaBean风格的 POJO,Calendar 不是。对于这些情况,Jackson 允许我们创建自定义反序列化器。一旦我们创建了反序列化器,我们就可以在 ContextResolver 中使用 ObjectMapper 注册它。例如

public class CalendarDeserializer extends JsonDeserializer<Calendar>  {

@Override
public Calendar deserialize(JsonParser jp, DeserializationContext dc)
throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
int year = getInt("year", node);
int month = getInt("month", node);
int dayOfMonth = getInt("dayOfMonth", node);
int hourOfDay = getInt("hourOfDay", node);
int minute = getInt("minute", node);
int second = getInt("second", node);

Calendar c = Calendar.getInstance();
c.set(year, month, dayOfMonth, hourOfDay, minute, second);
return c;
}

private int getInt(String name, JsonNode node) {
return (Integer) ((IntNode) node.get(name)).numberValue();
}
}

要用 ObjectMapper 注册它,我们可以这样做

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Calendar.class, new CalendarDeserializer());
mapper.registerModule(module);

要在我们的 JAX-RS 应用程序中使用 ObjectMapper,我们可以在 ContextResolver 中创建它,如 here 所示.您需要添加 jackson-databind作为依赖项,如果您还没有的话。

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson2.version}</version>
</dependency>

请注意,上述依赖项已随 JAX-RS 的 Jackson JSON 提供程序一起提供,因此如果您已经拥有 Jackson JSON 支持依赖项,则不需要它。

我已经使用您提供的 JSON 对其进行了测试,它工作正常。

查看有关自定义反序列化器的更多信息 here

关于java - 如何将 Java 日历对象的 JSON 表示传递给 REST 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31118007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com