我正在构建一个REST网络服务。某些类的属性类型为DateTime
(JodaTime)。
将此对象发送给我的客户端(Javascript)时,我的对象
private DateTime date;
被转化为
{ date: { chronology: {}, millis: 1487289600000 } }
问题是我把这个对象发回服务器时出错了,因为我无法实例化Chronology
我想有像{date:1487289600000}
-任何其他格式都可以。
环境
我的上下文解析器是
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
final ObjectMapper mapper = new ObjectMapper();
public ObjectMapperContextResolver() {
mapper.registerModule(new JodaModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
我错过了什么?如果我没有使用ObjectMapperContextResolver,我会得到相同的结果
我添加了< code > Jackson-jaxrs-JSON-provider 2 . 8 . 8
、< code > Jackson-jaxrs-base 2 . 8 . 8 和< code > Jackson-module-JAXB-annotations 2 . 8 . 8
我的上下文解析器现在是这样的
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
final ObjectMapper mapper = new ObjectMapper();
public ObjectMapperContextResolver() {
mapper.registerModule(new JodaModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
还有我的应用程序配置
@javax.ws.rs.ApplicationPath("/")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
resources.add(AuthenticationFilter.class);
resources.add(CORSFilter.class);
resources.add(ObjectMapperContextResolver.class);
resources.add(JacksonJsonProvider.class);
resources.add(ServiceResource.class);
return resources;
}
}
我的服务资源
@Path("service")
public class ServiceResource {
@Path("/forecast/stocks/{modelId}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Value> getStocks(@PathParam("modelId") String modelId, @QueryParam("startDate") String startDate, @QueryParam("endDate") String endDate) {
try {
DateTime datetimeStart = formatStringToDatetime(startDate);
DateTime datetimeEnd = formatStringToDatetime(endDate);
return logicClass.getStocks(modelId, datetimeStart, datetimeEnd);
} catch (Exception e) {
logger.log(Level.SEVERE, "Error calling /hydromax/forecast/stocks", e);
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
}
}
}
和值
对象
public class Value {
private DateTime date;
private Float value;
public Value() {
}
//getter and setter
}
我在< code>ApplicationConfig中添加了以下代码
@Override
public Map<String, Object> getProperties() {
Map<String, Object> props = new HashMap<>();
props.put("jersey.config.server.disableMoxyJson", true);
return props;
}
我的日期时间
现在已转换为
"date":{"dayOfMonth":16,"dayOfWeek":4,"era":1,"year":2017,"dayOfYear":47,"weekOfWeekyear":7,"secondOfMinute":0,"millisOfSecond":0,"weekyear":2017,"monthOfYear":2,"hourOfDay":10,"minuteOfHour":0,"yearOfEra":2017,"yearOfCentury":17,"centuryOfEra":20,"millisOfDay":36000000,"secondOfDay":36000,"minuteOfDay":600,"millis":1487235600000,"zone":{"fixed":false,"uncachedZone":{"fixed":false,"cachable":true,"id":"Europe/Paris"},"id":"Europe/Paris"},"chronology":{"zone":{"fixed":false,"uncachedZone":{"fixed":false,"cachable":true,"id":"Europe/Paris"},"id":"Europe/Paris"}},"afterNow":false,"beforeNow":true,"equalNow":false}
部署后第一次调用服务时,我遇到了这个错误
javax.servlet。ServletException:org.glassfish.jersey服务器。容器异常:java.lang.NoClassDefFoundError:com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector
您可能在应用程序中缺少杰克逊-贾克斯-json-提供程序
模块。
该模块是JAX-RS实现(如Jersey和RESTeasy)的Jackson JSON提供者。
仅当需要为 Jackson JSON 提供程序自定义对象映射程序
时,才需要对象映射器
的上下文解析
器。但是,如果杰克逊提供程序未注册,则上下文解决程序
不会执行任何操作。
这是您需要的依赖项:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.8.8</version>
</dependency>
如果没有使用Maven,请将< code > Jackson-jaxrs-JSON-provider-2 . 8 . 8 . jar 添加到类路径中。
然后根据需要注册杰克逊约翰逊提供器
(仅使用杰克逊注释)或杰克逊JaxbJson提供程序
(同时使用杰克逊和JAXB注释)。
我对jackson进行了配置,以便在和时给出一个简单的字符串表示。这可以在序列化过程中找到,例如,当我在REST API上获得数据时。 但反过来就不行了。当我试图将数据发送到服务器,并且应该将JSON解析为java对象时,会引发此异常: 很抱歉没有提到我在单元测试中。 TestClass:
问题内容: 我需要设置班级日期序列化的格式。我有Jackson的版本,没有@JsonFormat。这就是为什么我编写自定义类的原因: } 并使用它: 但是,我还有另一个具有不同日期格式的字段,并且我不想创建用于序列化的其他类。我可以将所有需要的格式(例如常量)添加到CDJsonDateSerializer类中,并通过注释设置所需的格式吗?像这样: 。 下面的答案后: 经过一些更正后,它可以工作。我
(我在UTC 2时区,我假设是2小时的差异)。 我正忙于编写一个JSON RESTful API,它是Grails应用程序的一部分(特别是本项目的2.0.3,但这个问题在其他版本中也会出现)。我使用Jackson对Json进行序列化和反序列化,JsonService的配置如下所示:http://pastebin.com/JacytMuF 因此,多个域对象的值在单个DTO中进行了整理和表示(在本例中
问题内容: 我想将日期从Twitter反序列化为。我的程序在反序列化领域失败。 我的网域课程 我的解析方法 两项测试均失败,并出现java.time.ZonedDateTime 错误。 我已经检查了关于Stackoverflow的类似问题,我的格式看起来正确。 我做错了吗? 解决了 问题出在地区。添加确切的区域设置后,测试开始通过。 对于 用于测试 问题答案: 尝试在您的媒体资源上添加此注释
我想将Twitter上的日期反序列化为。我的程序在<code>created_at</code>字段反序列化时失败。 我的域名类 我的解析方法 两个测试都失败,java.time.ZonedDateTime 类型的值。 我在Stackoverflow上检查了类似的问题,我的格式看起来是正确的。 我做错了? 解决 问题出在区域设置中。添加确切的区域设置后,测试开始通过。 对于<code>jackso
有没有办法让Jackson序列化某个流对象(并在之后关闭)?这样地: 使现代化 澄清:我想流式传输内容,而不仅仅是将其序列化到单个String对象。