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

时间:2015-01-31 23:21:06

标签: json jaxb

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

我想在域对象中添加注释,以指定哪些字段应转换为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)单独的注释放置策略'对于json和xml,如果需要以不同的方式标记不同的方法作为标准,那会让人感到困惑。

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

3)必须使像getPassword()这样的方法变为私有。我仍然希望能够在内部调用getPassword()。

有没有人这样做过或有任何想法?

修改

包含IBM的图片,其中显示了我运行的设计,在业务逻辑层中使用带有注释的显式DTO。表示层根据传入的URL确定要请求和服务的DTO。

enter image description here

1 个答案:

答案 0 :(得分:1)

如果您非常关心如何区分您的业务类和转移的内容,您可以考虑实施一个单独的DTO类包,它将明确包含您想要转移的属性。

在这种情况下,您必须明确包含传输属性,但这不会发生,因为程序员忘了它。

还有其他方法可以添加一些验证规则,忽略password之类的属性,并在JAXB上下文级别强制执行它们。但只有在不知道的人会将其命名为kennwortcredentials或其他任何可能出现的情况并且您的验证规则将失效时,此功能才有效。

所以我看到两种方式: *要么信任程序员(以及代码审查等所有QA / QS流程)来支持她/他。 *或者您明确转移课程。

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