【问题标题】:Apache CXF make addtitinal classes "known" to JAXB contextApache CXF 使附加的类对 JAXB 上下文“已知”
【发布时间】:2017-03-28 15:41:30
【问题描述】:

在将 DTO 序列化为 XML 时,如何配置 Apache CXF 客户端和服务器以将其他类传递给 JAXBContext?

我不能使用@XmlSeeAlso 注释,因为这些类在编译带有数据协定的 jar 时是未知的,但在客户端编译时是已知的。

在客户端我尝试使用:

Service service = Service.create(wsdlURL, serviceName, new UsesJAXBContextFeature(MyFactory.class));
T client = service.getPort(clazz);

但我收到异常,告诉我 CXF 不支持此功能。

【问题讨论】:

    标签: java jaxb cxf jax-ws


    【解决方案1】:

    您也可以使用注释来做到这一点。

    适用于 Spring Boot CXF 启动器

    @Autowired
    private Bus bus;
    
    @Bean
    public Endpoint createMyEndpoint() {
    
        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
        Map<String, Object> properties = new HashMap<>();
        properties.put("jaxb.additionalContextClasses", getExtraClasses());
        factory.setProperties(properties);
    
        Endpoint endpoint = new EndpointImpl(bus, new MyWebService(),factory);
        endpoint.setProperties(new HashMap<>());
        endpoint.publish("/v1/service");
        return endpoint;
    }
    
    @SuppressWarnings("rawtypes")
    private Class[] getExtraClasses() {
        List<Class> extraClassList = new ArrayList<>();
    
        extraClassList.add(A.class);
        extraClassList.add(B.class);
    
        return  extraClassList.toArray(new Class[extraClassList.size()]);
    }
    

    ...

    @javax.jws.WebService
    public class MyWebService implements MyPortType {
        //...
    }
    

    我想通了

    https://issues.apache.org/jira/browse/CXF-340

    https://github.com/apache/cxf/blob/5578e0b82bcd4ea19c1de5b4a008af35f9c8451b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java#L164

    【讨论】:

      【解决方案2】:

      如果您使用 cxf.xml (spring-xml) 配置 cxf,您可以使用以下内容:

      <jaxws:endpoint/client>
        <jaxws:properties>
          <entry key="jaxb.additionalContextClasses">
            <array value-type="java.lang.Class">
                <value type="java.lang.Class">fullQualifiedClassName</value>
            </array>
          </entry>
         </jaxws:properties>
      </jaxws:endpoint>
      

      或任何其他方式来编写 org.apache.cxf.jaxb.JAXBDataBinding 属性“extraClass”(一个 Class[]),例如 .见http://cxf.apache.org/docs/jaxb.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-16
        相关资源
        最近更新 更多