Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB生成的类可通过JAX-WS绑定序列化_Java_Jaxb_Jax Ws_Cxf - Fatal编程技术网

Java JAXB生成的类可通过JAX-WS绑定序列化

Java JAXB生成的类可通过JAX-WS绑定序列化,java,jaxb,jax-ws,cxf,Java,Jaxb,Jax Ws,Cxf,具有JAXB-RI和CXF。首先是WSDL。我想要一个生成的类来实现Serializable。现在我有了下面的绑定xml,它可以工作(SEI类名被更改) 不,在这种情况下,我应该在哪里补充什么。我试过: <xsd:annotation> <xsd:appinfo> <jaxb:globalBindings> <xjc:serializable uid="12343" /> <

具有JAXB-RI和CXF。首先是WSDL。我想要一个生成的类来实现
Serializable
。现在我有了下面的绑定xml,它可以工作(SEI类名被更改)


不,在这种情况下,我应该在哪里补充什么。我试过:

<xsd:annotation>
    <xsd:appinfo>
        <jaxb:globalBindings>
            <xjc:serializable uid="12343" />
        </jaxb:globalBindings>
    </xsd:appinfo>
</xsd:annotation>


标记的内部和外部-要么未添加
可序列化
,要么根本未生成类(无任何错误)

另见


那么,具体如何做到这一点呢?我通过两种方式实现了这一点:

  • 使用第二个绑定文件(仅限于JAXB),如中的Pascal所示

  • 通过指定另一个处理整个命名空间的
    标记:

    <bindings
        node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://www.yoursite.com/services/mynamespace']">
        <jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <jxb:serializable />
        </jxb:globalBindings>
    </bindings>
    
    
    

  • 您可以实现一个XJC插件来实现这一点:

    public class SerializablePlugin extends Plugin
    {
    
      @Override
      public boolean run(Outline outline, Options options, ErrorHandler errorHandler) throws SAXException
      {
       for (ClassOutline classOutline : outline.getClasses())
       {
        JDefinedClass definedClass = classOutline.implClass;
        definedClass._implements(codeModel.ref(Serializable.class));
       }
       return true;
      }
    
     ...
    }
    
    然后,您可以将插件添加到SchemaCompiler选项中:

    WsimportOptions wsimportOptions = new WsimportOptions();
    wsimportOptions.getSchemaCompiler().getOptions().activePlugins.add(new SerializablePlugin());
    

    JAXB绑定定制是一个真正的难题。它们是JAXB1.x糟糕的旧时代遗留下来的东西,而且它从来没有为2.x进行过适当的重新设计。可能的重复可以在这些基础上扩展吗?对于#1,如何将第二个文件传递到
    wsimport
    ?对于#2,
    中的哪个位置是这样的,
    jaxws
    是示例中的默认名称空间?
    public class SerializablePlugin extends Plugin
    {
    
      @Override
      public boolean run(Outline outline, Options options, ErrorHandler errorHandler) throws SAXException
      {
       for (ClassOutline classOutline : outline.getClasses())
       {
        JDefinedClass definedClass = classOutline.implClass;
        definedClass._implements(codeModel.ref(Serializable.class));
       }
       return true;
      }
    
     ...
    }
    
    WsimportOptions wsimportOptions = new WsimportOptions();
    wsimportOptions.getSchemaCompiler().getOptions().activePlugins.add(new SerializablePlugin());