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-jaxwscxf-rt-transports-http 以使用CXF。但是我在我的 WAR 包中看到了 jaxb-impl-2.1.13.jarcxf-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 有效

在c#中,用soap调用webservice,发送消息并取得webservice方法里返回的内容,用http 的方法

IBM MQ 集成CXF 发送JMS 消息

关于webservice(CXF)的一些理解

如何通过排除特定格式的某些波段来排除空格?