CXF:通过 SOAP 发送对象时如何排除某些属性?
Posted
技术标签:
【中文标题】CXF:通过 SOAP 发送对象时如何排除某些属性?【英文标题】:CXF: how to exclude some properties when object sent through SOAP? 【发布时间】:2011-12-04 10:44:56 【问题描述】:我使用 Apache CXF 2.4.2,当我将数据库中的一些对象返回给用户时,我想排除一些属性(例如密码)。我怎样才能做到这一点不创建临时类?这个有注释吗?
【问题讨论】:
【参考方案1】:我假设您使用 JAXB 进行对象-XML 映射。在这种情况下,只需在数据库实体中使用 @XmlTransient
注释要跳过的字段。
@XmlTransient
private String password;
但是请注意,有一天您会意识到您确实需要一个临时类,主要用于将您的 CXF Web 服务与后端分离。毕竟你不想一直记住在数据库中添加一列会立即破坏 SOAP 接口......
【讨论】:
我不确定我用的是什么,因为我只在pom.xml
中添加了cxf-rt-frontend-jaxws
和cxf-rt-transports-http
以使用CXF。但是我在我的 WAR 包中看到了 jaxb-impl-2.1.13.jar
和 cxf-rt-databinding-jaxb-2.4.3.jar
,所以看起来你是对的。我尝试使用@XmlTransient
没有运气:( 我还在全班添加了@XmlRootElement
,但没有任何改变。您还有其他提示吗?
您好!我在谷歌上搜索并做很少的研究,发现了如何解决我的问题。看我的更新。我也赞成您的回答,因为它可以帮助我找到正确的解决方案。谢谢!【参考方案2】:
根据@tomasz-nurkiewicz 的评论,我应该使用@XmlTransient
注释。但如文档中所述
默认情况下,如果类上的@XmlAccessorType 不存在,并且其父类都没有使用@XmlAccessorType 注释,则假定该类的以下默认值:
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
其中XmlAccessType.PUBLIC_MEMBER
表示:
每个公共 getter/setter 对和每个公共字段都将自动绑定到 XML,除非由 XmlTransient 注释。私有的、受保护的或默认为仅包访问的字段或 getter/setter 对仅当它们由适当的 JAXB 注释显式注释时才绑定到 XML。
这就是为什么 @XmlTransient
在 Tomasz Nurkiewicz 的示例中不能用于私有字段的原因。有两种可能的方法来解决这个问题:
1) 为公共 getter 添加注解:
private String password;
@XmlTransient
public String getPassword()
return password;
2) 将@XmlAccessorType
添加到类中:
@XmlAccessorType(XmlAccessType.FIELD)
public User
@XmlTransient
private String password;
发现于:http://old.nabble.com/@XmlTransient-ignored-td7406659.html
【讨论】:
以上是关于CXF:通过 SOAP 发送对象时如何排除某些属性?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apache CXF 调用 SOAP API 时发生 ClassCastException
使用 Apache CXF 在 SOAP POST 请求中出错,但 curl 有效