【问题标题】:CXF SOAP service preserve spaceCXF SOAP 服务保留空间
【发布时间】:2016-02-25 15:14:27
【问题描述】:

我有 CXF 肥皂网络服务。

@Component
@WebService(endpointInterface = "com....MyWs", serviceName="MySrv")
public class MyWsImpl implements MyWs {
    @Override
    public List<MyModel> get(String customer) {
        List<MyModel> models = ...;
        return models;
    }
}

MyModel 中有一个字段可以是空格 (" "),但解析器会修剪该值并将其序列化为 &lt;mySpaceVal&gt;&lt;/mySpaceVal&gt;,而我想要 &lt;mySpaceVal&gt; &lt;/mySpaceVal&gt;

我该怎么做?

我尝试添加

@XmlAttribute(name="space", namespace="xml")
public final static String space = "preserve";

到 MyModel 以便解析器可以添加 xml:space="preserve" 属性。 但它添加了一个命名空间ns3="xml",并将属性显示为ns3:space="preserve",并且元素显示为空字符串而不是" "

【问题讨论】:

  • 你能插入吗  反而?有一个空格字符是一个糟糕的设计,但如果这是你所坚持的,你可能需要使用转义序列。
  • @stdunbar 感谢您的回复,但它不起作用。框架转义了字符串,我最终得到&lt;mySpaceVal&gt;&amp;amp;nbsp;&lt;/mySpaceVal&gt;
  • 不幸的是,这并不意外。还有什么可以放在那里的吗?空间角色很难单独拥有。像“-s-”或其他字符这样的“哨兵”值怎么样?
  • @stdunbar 不幸的是,这个值来自另一个系统。它可以是一些普通的字符串,如“123”,但“”也是有效的,我必须将它发送给 Web 服务的客户端。

标签: java xml web-services soap jaxb


【解决方案1】:

您可以使用jaxb 适配器将字符串值包装在&lt;![CDATA[]]&gt; 部分中:

@XmlJavaTypeAdapter(CDATAXmlAdapter.class)
public final static String space = "...";

private static class CDATAXmlAdapter extends XmlAdapter<String, String> {
    @Override
    public String marshal(final String value) throws Exception {
        // you may want to apply additional value escaping to avoid
        // CDATA nesting problem
        return "<![CDATA[" + value + "]]>";
    }

    @Override
    public String unmarshal(final String value) throws Exception {
        // If you expect that server will send CDATA as well
        // then you need to strip CDATA from value
        return value;
    }
}

【讨论】:

    猜你喜欢
    • 2021-08-13
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多