相关疑难解决方法(0)

如何自定义JAXB如何生成多个方法名称?

我们使用JAXB生成Java类,并且遇到了生成多个方法名称不正确的一些情况.例如,我们期望getPhysicians得到的地方getPhysicien.我们如何定制JAXB如何将特定方法复数化?

架构:

<xs:complexType name="physician">
    <xs:sequence>
       ...
    </xs:sequence>
</xs:complexType>

<xs:complexType name="physicianList">
    <xs:sequence>
        <xs:element name="Physician"
                    type="physician"
                    minOccurs="0"
                    maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

生成的Java代码:

...
public class PhysicianList {
...

    @XmlElement(name = "Physician")
    protected List<Physician> physicien;
    ...

    public List<Physician> getPhysicien() {
        if (physicien == null) {
            physicien = new ArrayList<Physician>();
        }
        return this.physicien;
    }
Run Code Online (Sandbox Code Playgroud)

更新

Blaise已经回答了这个问题.但是,我不希望在XML模式中混合诸如JAXB自定义之类的问题.所以对于那些具有相同偏好的人来说,这里有一个JAXB绑定文件,它实现了与Blaise建议的相同的东西,使JAXB自定义不受模式的影响:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               version="2.0">

    <jaxb:bindings schemaLocation="myschema.xsd">
        <jaxb:bindings node="//xs:complexType[@name='physicianList']//xs:element[@name='Physician']">
            <jaxb:property name="physicians"/>
        </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>
Run Code Online (Sandbox Code Playgroud)

java xml jaxb jaxb2

39
推荐指数
2
解决办法
3万
查看次数

为什么JAXB 2 RI的XJC简单模式会改变集合名称?

JAXB简单绑定模式将集合名称修改为其复数"版本",例如"additionalData"变为"additionalDatas".有没有改变这种行为的解决方案?我需要一个Java字段名称和方法名称等于XSD字段名称.我的绑定文件:

<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
            xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
            xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
            xsi:schemaLocation="
http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
version="2.1">
  <globalBindings>
    <serializable uid="1" />
    <xjc:simple/>
  </globalBindings>
</bindings>
Run Code Online (Sandbox Code Playgroud)

java java-metro-framework jaxb jaxb2

10
推荐指数
1
解决办法
1万
查看次数

使用CXF和wsdl2java生成代码时解决冲突

我在使用wsdl2java通过带有Maven的cxf-codegen-plugin从一堆WSDL文件生成代码时遇到了一些冲突.WSDL声明了同一系统的不同API,并且生成的代码有一些重叠(特别是对于模型类).外部系统和WSDL来自第三方,因此不受我们控制.

我遇到的第一个问题是ObjectFactory由其中一个WSDL引起的结果类中的命名冲突.它定义了一个complexType,其名称Foo包含一个带有名称的元素,Status它还定义了一个带有名称的元素FooStatus.在生成代码时,JAXB会抛出一个拟合,因为它ObjectFactory有两个带有名称的工厂方法,createFooStatus(...)并且在运行时最终会出现异常.我试过提供-autoNameResolutionwsdl2java 的选项但没有用.我看过"两个声明导致ObjectFactory类中的冲突""将外部JAXB绑定文件应用于从WSDL导入的模式元素",并基于那些我编写的外部绑定文件重命名其中一个工厂方法.我在绑定文件中使用SCD而不是XPath,如后一个链接所示,因为我和XPath的问题与作者有同样的问题.这是有效的,但前提是我单独处理WSDL文件并仅将绑定文件应用于导致冲突的WSDL.Maven配置如下所示:

<plugin>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-codegen-plugin</artifactId>
  <version>3.0.0-milestone1</version>
  <executions>
    <execution>
      <id>generate-proxies</id>
      <phase>generate-sources</phase>
      <configuration>
        <wsdlOptions>
          <wsdlOption>
            <wsdl>${basedir}/First.wsdl</wsdl>
            <bindingFiles>
              <bindingFile>${basedir}/bindings.xml</bindingFile>
            </bindingFiles>
          </wsdlOption>
          <wsdlOption>
            <wsdl>${basedir}/Second.wsdl</wsdl>
          </wsdlOption>
          <wsdlOption>
            <wsdl>${basedir}/Third.wsdl</wsdl>
          </wsdlOption>
          ... More wsdlOption declarations ...
        </wsdlOptions>
      </configuration>
      <goals>
        <goal>wsdl2java</goal>
      </goals>
    </execution>
  </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做,我最终会遇到另一个问题,因为来自不同WSDL文件的生成代码使用相同的包结构.这在实践中意味着在ObjectFactory处理后续WSDL文件时会覆盖类,这意味着在插件执行之后只存在从最后一个WSDL生成的类.我知道我可以更改目标包结构,但是从不同的WSDL生成的代码有很多重叠,复制它会感觉很傻.我也尝试过使用-keepwsdl2java选项,但这似乎没有做任何事情(或者至少ObjectFactory类仍然被覆盖).我的理解是,对此的解决方案是使用像这样的Maven配置一次性处理所有WSDL(仅显示配置部分,所有其他保持不变):

<configuration>
  <defaultOptions>
    <bindingFiles>
      <bindingFile>${basedir}/bindings.xml</bindingFile>
    </bindingFiles>
  </defaultOptions>
  <wsdlRoot>${basedir}</wsdlRoot>
  <includes>
    <include>*.wsdl</include>
  </includes>
</configuration>
Run Code Online (Sandbox Code Playgroud)

但是,这导致a com.sun.istack.SAXParseException2,表示我的SCD表达式与任何模式组件都不匹配(因为模式组件仅存在于其中一个WSDL中).

如果我修改WSDL文件本身并使用后面的Maven配置而不使用绑定文件,我可以得到我想要的结果.通过这样做,结果ObjectFactory是与使用第一个Maven配置单独处理WSDL时创建的合并.但是,我宁愿不这样做,而是想用外部绑定文件来管理它.我该如何解决这个问题?我可以编写/应用绑定文件,以便在找不到匹配的模式组件时不会引发异常吗?或者我可以单独处理WSDL而不是覆盖 …

java wsdl web-services jaxb maven

8
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×3

jaxb ×3

jaxb2 ×2

java-metro-framework ×1

maven ×1

web-services ×1

wsdl ×1

xml ×1