gpt4 book ai didi

java - 通过 XSD def 将逻辑代码插入生成的 JAXB java 文件中

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:34 25 4
gpt4 key购买 nike

问题是,出于某种原因。 xsd 不/不能定义除基本属性以及 setter 和 getter 之外的所有逻辑变量,因此我们尝试通过 xsd 定义“注入(inject)代码”,这实际上已被其他人讨论过几次。我对“简单注入(inject)”和“简单java方法”没有任何问题,它不需要在类定义之上任何“导入”语句。

但是如果我们想使用它的话。在我看来,除了 setter 或 getter 之外,我们无法获取或导入任何包。 ,详情见下文

  1. xsd 定义 test.xsd

             <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema targetNamespace="http://company.com/schema/response"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:test="http://company.com/schema/response"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
    xmlns:ci="http://jaxb.dev.java.net/plugin/code-injector"
    jaxb:extensionBindingPrefixes="ci">
    <xs:element name="client">
    <xs:complexType>
    <xs:annotation>
    <xs:appinfo>
    <ci:code>
    <![CDATA[
    private String str;
    public String returnStr() {
    Locations locationCls =this.getLocations();
    List<String> locationids = new ArrayList<String>();

    // get a list of locationid into locationids (list)
    List<Location> locationList = locationCls.getLocation();
    for (Location loc : locationList) {
    locationids.add(String.valueOf(loc.getId()));
    }
    // return string like loc1,loc2,loc3
    return StringUtils.join(locationids, ',');
    }
    ]]>
    </ci:code>
    </xs:appinfo>
    </xs:annotation>
    <xs:sequence>
    <xs:element name="name" type="xs:NCName" />
    <xs:element name="pass" type="xs:NCName" />
    <xs:element ref="test:locations" />
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    <xs:element name="locations">
    <xs:complexType>
    <xs:sequence>
    <xs:element maxOccurs="unbounded" ref="test:location" />
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    <xs:element name="location">
    <xs:complexType>
    <xs:attribute name="id" use="required" type="xs:string" />
    <xs:attribute name="address" use="required" type="xs:string" />
    <xs:attribute name="biz" type="xs:string" />
    </xs:complexType>
    </xs:element>
    </xs:schema>
  2. 运行 jaxb ri 命令:xjc.bat test.xsd -Xinject-code -扩展

  3. 成功观察Client.java中的以下代码片段

           private String str;
    public String returnStr() {
    Locations locationCls =this.getLocations();
    List<String> locationids = new ArrayList<String>();

    // get a list of locationid into locationids (list)
    List<Location> locationList = locationCls.getLocation();
    for (Location loc : locationList) {
    locationids.add(String.valueOf(loc.getId()));
    }
    // return string like loc1,loc2,loc3
    return StringUtils.join(locationids, ',');
    }

因此,我们知道 jdk 会提示编译错误,因为 Apache commons 中的 StringUtils(或其他第三部分 util 工具,如 google 集合以在其他情况下提供帮助)未导入到生成的文件中。了解有一些 google 项目使用 jaxb 插件将方法插入或调用到生成的 java 文件中。只是想花一天左右的时间看看我们是否可以仅通过 xsd 本身而不使用任何插件来制作它。任何想法将不胜感激。

最佳答案

您可以在要注入(inject)的代码中指定完全分类的类名称,例如:

return org.apache.commons.lang.StringUtils.join(locationids, ',');

关于java - 通过 XSD def 将逻辑代码插入生成的 JAXB java 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11834573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com