我使用带有Jackson转换器的Restlet发送一个带有一些原始字段的对象。到目前为止,它运作良好。 但后来我需要我的对象来实现Serializable,因为我需要将它存储在GAE的memcache中。 出于某种原因 - 当类实现Serializable时,事情就会停止工作。
Restlet从之前发送一个不同的字符串表示,我甚至无法在服务器中打印该字符串。我尝试打印它的字节值,char-by-char,第一个数字是:
0xfffd 0xfffd 0x0000 0x0005 0x0073 0x0072
非常感谢!
答案 0 :(得分:2)
发生的事情是您获得了将 DefaultConverter 应用于返回值而不是JacksonConverter的结果。 DefaultConverter将Serializable对象转换为ObjectRepresentation,这是一个二进制表示形式(对象的序列化形式)。在没有请求特定媒体类型的情况下,转换器逻辑将Serializable视为可以同等转换为ObjectRepresentation或JacksonRepresentation,并且由于转换器的排序方式,它选择前者。
有几种方法可以解决这个问题。最简单的方法是在请求中明确指定所需的媒体类型(MediaType.APPLICATION_JSON)。
更强大的解决方案是将JacksonConverter替换为您自己的自定义版本,该版本将null Variant评分高于当前值0.5。如果你想要覆盖当前为每次转换创建新ObjectMapper的当前JacksonRepresentation行为,或者如果你想使用Jackson 2.0,你还是想要这样做。搜索重定时讨论列表以查找有关如何完成此操作的帖子。 (tpeierls)
很可能在最近的版本中修复了这种行为,我知道有关此问题的工作正在进行中,因此在执行任何行动之前,请搜索JacksonConverter的问题跟踪器。
答案 1 :(得分: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时,事情就破了。