0

我正在使用带有杰克逊转换器的 Restlet 发送一个带有一些原始字段的对象。到目前为止,它工作得很好。但是后来我需要我的对象来实现 Serializable,因为我需要将它存储在 GAE 的 memcache 中。出于某种原因 - 当类实现 Serializable 时,事情就停止了。

Restlet 发送与以前不同的字符串表示形式,我什至无法在服务器中打印该字符串。我尝试逐个打印它的字节值,第一个数字是:

0xfffd 0xfffd 0x0000 0x0005 0x0073 0x0072

非常感谢!

4

2 回答 2

2

发生的事情是您将DefaultConverter应用于返回值而不是 JacksonConverter 的结果。DefaultConverter 将 Serializable 对象转换为 ObjectRepresentation,它是一种二进制表示(对象的序列化形式)。在没有请求特定媒体类型的情况下,转换器逻辑将 Serializable 视为同样可转换为 ObjectRepresentation 或 JacksonRepresentation,并且由于转换器的排序方式,它选择前者。

有几种方法可以解决这个问题。最简单的方法是在请求中明确指定所需的媒体类型 (MediaType.APPLICATION_JSON)。

更强大的解决方案是将 JacksonConverter 替换为您自己的自定义版本,该版本对 null Variant 的评分高于当前值 0.5。如果您想覆盖当前为每次转换创建新 ObjectMapper 的 JacksonRepresentation 行为,或者如果您想使用 Jackson 2.0,则无论如何您都需要这样做。在 restlet-discuss 列表中搜索我关于如何完成此操作的帖子。(特派尔斯)

这种行为很可能已在最近的版本中得到修复,而且我知道与此相关的问题正在进行中,因此在采取任何行动之前,请在问题跟踪器中搜索 JacksonConverter。

于 2012-06-04T16:37:21.610 回答
1

这可能不是您正在寻找的东西,但它足够相似,我认为它可能有用。

我正在使用 Restlet/Android 访问我在 Restlet/GAE 中构建的 API。在某些时候,我不得不更改代表系统中基本对象的 pojo 类来实现 Serializable。当我这样做时,我从服务器获取这些对象的尝试开始失败,出现 415 错误。为了解决 Restlet 对发送哪个表示的混淆,我添加了:

Engine.getInstance().getRegisteredConverters().add(0, new JacksonConverter());

在做我的帖子()之前。还有一些额外的讨论: http://restlet-discuss.1400322.n2.nabble.com/Restlet-Android-Object-representation-selection-application-x-java-serialized-object-vs-application--td6876345。 html

我意识到我没有使用原语——关键的联系是,一旦我添加了可序列化,事情就坏了。

于 2012-06-04T16:13:19.653 回答