当前位置: 首页 > 面试题库 >

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

南门欣怡
2023-03-14
问题内容

问题是,由于某种原因。除了基本属性,设置器和获取器之外,xsd不能/不能定义所有逻辑变量,因此我们尝试通过xsd定义“注入代码”,而其他人实际上已经讨论了两次。我对带有“简单java方法”的“简单注入”没有任何问题,该类不需要在类def之上的任何“导入”语句。

但是如果我们想使用它的话。在我看来,除了setter或getters之外,我们无法获取或导入任何软件包。,请参阅下面的详细信息

  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 -extension

  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(或其他第3部分实用工具,例如google集合,以在其他情况下提供帮助)未导入生成的文件中。了解有些Google项目使用jaxb插件在生成的Java文件中插入或调用方法。只是想花一天左右的时间,看看我们是否可以仅使用xsd本身而无需任何插件。任何想法将不胜感激。


问题答案:

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

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


 类似资料:
  • 如何在我的Apple类中生成BigDecimal?现在我只有一个字节缓冲符。。。。 使用Avro模式(avsc): 使用IDL: 使用maven生成方法mvn clean compile和以下maven代码段: 这两种方法都返回了这个丑陋的方法,显然几乎无法使用。。。 如何使此方法请求BigDecimal?这是使用Avro

  • 问题内容: 我已经在python中使用xml.etree.ElementTree创建了一个xml文件。然后我用 将文档写到文件中。 但是,当我使用文本编辑器打开文件名时,标记之间没有换行符。一切都是一条大线 我如何以“漂亮打印”格式写出文档,以便所有xml标记之间都有新行(以及希望的缩进等)? 问题答案: 我认为最简单的解决方案是切换到lxml库。在大多数情况下,您只需将导入从更改为或类似即可。

  • 问题内容: 我想创建一个用于编辑文本文件的简单程序(用Java),尤其是一个可以在文本文件中的任意位置插入任意文本的程序。此功能是我当前正在编写的一个较大程序的一部分。 阅读有关java.util.RandomAccessFile的描述,似乎在文件中间执行的任何写操作实际上都将覆盖现有内容。这是我要避免的副作用(如果可能)。 有没有简单的方法可以做到这一点? 提前致谢。 问题答案: 好的,这个问题

  • 我使用swagger-codigen-2.1.6和成功生成序列化模型类通过swagger-codigen-maven-plugin使用序列化模型配置选项。但是,我没有看到序列VersionUID添加到类中,也找不到任何留档来包含它。任何帮助都将不胜感激。提前感谢。

  • 我试图理解代码生成器doGenerate如何调用。我拿了一个没有任何自定义更改的Xtext Project示例(只有问候)。由默认代码生成器看起来像这样: 运行生成的Eclipse插件并在/src中创建了新的Java项目,文件扩展名为right(src.MyDsl)。并将项目转换为xtext nature,我写了一些问候语并保存了下来。但在src gen中,我没有看到生成的文件问候语。txt。所以

  • 我正在尝试将一个网站从Heroku迁移到AWS,但在代码构建方面遇到了麻烦。源代码在GitHub上,我使用的是CodePipeline-CodeBuild-Elastic Beanstalk。管道运行良好,代码似乎正在向Elastic Beanstalk过渡。然而,我被困在代码构建步骤。(buildspec.yml如下所示) 日志似乎可以很好地运行命令,但是当我将构建输出到S3存储桶时,没有构建文