我一直在使用 Restlet GA 的 3 月 2.2 快照,并使用 Jackson 来处理 JSON 转换。一切都运行良好,基本上是无形的。特别是,我什至不需要实例化 objectMapper。我也一直在使用 Joda DateTime,这也很好。
本周,我升级到最新的 2.2 Snapshot,它使用 Jackson 2.0.4(而不是 1.9)。在该版本的 Jackson 中,对 Joda DateTime 的支持已移至模块(在核心 Jackson 库之外)。
现在,当我运行测试代码时,出现以下错误:
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: org.restlet.engine.io.UnclosableInputStream@dcc5312; line: 1, column: 701] (through reference chain: com.fourspires.api.dto.CommitmentDTO["completeBy"]->org.joda.time.DateTime["year"])
当我尝试执行 Post() 时,这会导致 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);
}
然后我有 CommitmentServerResource
@Override
public final Representation postJson(final CommitmentDTO commitmentDTO) {...}
@Override
public final Representation postForm(final Form form) {...}
所以我看不到在哪里插入 objectMapper 以便可以调用 Post()。这就像我想设置全局/默认对象映射器,但我不知道在哪里可以找到它(或者它是否存在)。
我尝试将两行 objectMapper 代码添加到我的 createInboundRoot 中,但这似乎没有什么不同。
非常感谢您的任何建议,因为我似乎完全被困在这里......