2012-06-03 20 views
0

我使用Restlet和Jackson转换器发送一些具有原始字段的对象。到目前为止它效果很好。 但后来我需要我的对象来实现Serializable,因为我需要将它存储在GAE的memcache中。 出于某种原因 - 当类实现Serializable时,事情停止工作。当对象实现Serializable时Restlet/Jackson的工作方式不同

Restlet从以前发送不同的字符串表示,我甚至不能在服务器中打印该字符串。我试图打印它的字节值,char-by-char和第一个数字是:

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

非常感谢!

回答

2

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

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

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

这种行为很可能已在更新的版本中得到修复,而且我知道正在处理有关此问题的工作,所以在提交任何操作之前,请先搜索JacksonConverter的问题跟踪器。

+0

感谢您的详细解释。我会尝试你的建议,看看最好的结果。 – ravyoli

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

我意识到我没有使用原语 - 关键的连接是事情打破了,只要我添加了Serializable。

+0

谢谢!我会试试这个。该链接非常有帮助。似乎在开始时添加杰克逊的想法支持Tim的答案。 – ravyoli