我一直在使用Restlet GA的March 2.2 Snapshot一段时间,并使用Jackson来处理JSON转换。一切都工作得很好,基本上是无形的。特别是,我甚至从不需要实例化一个objectMapper。我也一直在使用乔达日期时间,这也很好。Restlet + Jackson - 在哪里注册模块
本周,我升级到最新的2.2快照,它使用杰克逊2.0.4(而不是1.9)。在那个杰克逊版本中,对Joda DateTime的支持已经被移到了一个模块中(杰克逊核心库之外)。
现在,当我跑我的测试代码,我得到的线沿线的一个错误:
WARNING: Unable to convert a [application/json,UTF-8] representation into an object of class com.fourspires.api.dto.CommitmentDTO
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "year" (class org.joda.time.DateTime), not marked as ignorable (2 known properties: , "chronology", "millis"])
at [Source: [email protected]; line: 1, column: 701] (through reference chain: com.fourspires.api.dto.CommitmentDTO["completeBy"]->org.joda.time.DateTime["year"])
,当我尝试做一个帖子(),它导致415错误。
从杰克逊乡亲的回答是,我必须注册处理转换如下JodaModule:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JodaModule());
这看起来很简单,但我不知道在哪里把这个代码。我的测试代码调用:
commitmentsResource =
rootClient.getChild(SOME_PATH, CommitmentsResource.class);
commitmentsClient = ((ClientProxy) commitmentsResource).getClientResource();
commitmentsClient.post()
在服务器端,我有一个接口:
public interface CommitmentsResource {
@Get Representation represent();
@Post("json") Representation postJson(CommitmentDTO commitment);
@Post("form") Representation postForm(Form commitmentForm);
}
然后我有了
@Override
public final Representation postJson(final CommitmentDTO commitmentDTO) {...}
@Override
public final Representation postForm(final Form form) {...}
所以我不能CommitmentServerResource看看在哪里插入objectMapper,以便Post()可以被调用。这就像我想设置全局/默认对象映射器,但我不知道在哪里找到它(或者它是否存在)。
我试着将两个objectMapper代码行添加到我的createInboundRoot中,但这似乎没有什么区别。
非常感谢您的任何意见,因为我好像在这里完全卡住....
去过:http://www.restlet.org/downloads/unstable - 我在“Google App Engine版”中选择了Zip存档在lib目录中,有一个名为com.fasterxml.jackson_2的目录1.0和在该目录中library.xml,我发现: <库ID =“杰克逊” ......高性能JSON处理器说明> 2.0 这让我觉得,这是Jackson的2.0.4版本,而不是2.1版本,这让我觉得我下载了错误的Restlet版本。 但我似乎无法找到更新的。 –
感谢您使用2.1版本的Jackson上传Restlet/GAE版本。我还将jackson-datatype-joda-2.1.0.jar添加到我的项目中(因为joda支持不在2.x中的jackson核心中)。最后,我添加了@JsonSerialize(使用= DateTimeSerializer.class) 为所有我的getter返回DateTime并修复了我上面的问题(415错误和年字段未找到)。 –