【问题标题】:Restlet/Jackson works differently when object implements Serializable当对象实现 Serializable 时,Restlet/Jackson 的工作方式不同
【发布时间】:2012-06-03 19:53:21
【问题描述】:

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

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

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

非常感谢!

【问题讨论】:

    标签: java jackson restlet


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的详细解释。我会尝试你的建议,看看什么效果最好。
    【解决方案2】:

    这可能不是您想要的,但它足够相似,我认为它可能有用。

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

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

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

    我意识到我没有使用原语 - 关键的联系是,一旦我添加了 Serializable,事情就崩溃了。

    【讨论】:

    • 谢谢!我会试试这个。该链接非常有帮助。似乎一开始就加杰克逊的想法支持了蒂姆的回答。
    猜你喜欢
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多