Вопрос по xsd, java, jaxb, xml – Вставьте логический код в сгенерированные Java-файлы JAXB по XSD def

1

Вопрос по какой-то причине. xsd не может определять все логические переменные, кроме базовых свойств, а также сеттеров и геттеров, поэтому мы пытались «ввести код»; по определению xsd, которые на самом деле обсуждались другими людьми пару раз. У меня нет проблем с «простой инъекцией» с «простым Java-методом» который не будет нуждаться в каком-либо импорте утверждение в верхней части класса Def.

еще как-то, если мы хотим использовать это. мне кажется, что мы не можем ни брать, ни импортировать какие-либо пакеты, кроме сеттеров или геттеров. подробнее см. ниже

xsd definition 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>

run jaxb ri command : xjc.bat test.xsd -Xinject-code -extension

observe below code snippet in the Client.java successfully

       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 жалуется на ошибку компиляции, поскольку StringUtils в Apache Commons (или других утилитах третьей части, таких как google collection, чтобы помочь в других сценариях) не импортируются в сгенерированный файл. Понимаю, что есть некоторые проекты Google, которые используют плагин jaxb для вставки или вызова метода в сгенерированные файлы java. просто хочу потратить день или около того, чтобы посмотреть, сможем ли мы сделать это с помощью самого xsd только без какого-либо плагина. любая идея будет оценена.

Ваш Ответ

1   ответ
1

который вы хотите внедрить, например:

return org.apache.commons.lang.StringUtils.join(locationids, ',');
Дэнни, отлично. это способ обойти эту проблему в некоторых случаях. и в этом случае все должно работать нормально. Ross Bu

Похожие вопросы