如何使用 Jackson 和 JaxB 序列化构建我的 RESTful 网络服务

How to architect my RESTful webservice with Jackson and JaxB serialization

我有一些敏感域对象,我想将其转换为 json 和 xml。我正在使用 spring 视图分辨率来执行此操作,但这不是重点。

我想向域对象添加注释以指定应将哪些字段转换为 xml / json。

类似

@XmlRootElement
public class SensitiveDomainObject { 

...

    public String getPassword() {...}

    @XmlAttribute
    @JsonValue
    public String getAccountName() {...}

    @XmlAttribute
    @JsonValue
    public String getGoldMemberStatus() {...}

}

我希望将 getAccountName() 和 getGoldMemberStatus() 序列化为 json 和 xml,但永远不要序列化 ​​getPassword。

我不想要的是

1) 将 'annotation placement strategies' 与 json 和 xml 分开,因为如果需要以不同的方式将不同的方法标记为标准,这会让人感到困惑。

2) 明确忽略字段。这是因为如果将来某个程序员出现并添加一个新的敏感字段而不包括例如 @JsonIgnore 注释,那么突然共享该敏感字段。

3) 必须将 getPassword() 之类的方法设为私有。我仍然希望能够在内部调用 getPassword()。

有没有人做过这个或者有什么想法?

编辑

包括一张来自 IBM 的图片,基本上显示了我 运行 所采用的设计,在业务逻辑层中使用带有注释的显式 DTO。表示层根据传入的 URL.

确定要请求和服务哪个 DTO

如果您非常关心区分您的业务 类 是什么以及转让的是什么,您可以考虑实施一个单独的 DTO 包 类,它将明确仅包含您的那些属性我想转让。

在这种情况下,您必须显式地包含传输属性,这是不可能发生的,因为程序员忘记了。

还有其他方法可以解决这个问题,比如添加一些验证规则来忽略 属性 之类的 password 并在 JAXB 上下文级别强制执行它们。但这只会在不知道的人将其命名为 kennwortcredentials 或任何可能想到的名称之前有效,并且您的验证规则将失效。

所以我看到两种方式: * 要么你信任程序员(以及所有 QA/QS 过程,如代码审查等)来支持 her/him。 * 或者你让你的转移类明确。

对于重要的外部接口,我可能会采用第二种方法(显式 DTO)。如果 password 在那里结束,那不是因为忘记,而是故意的。