3

org.jvnet.jaxb2.maven2 :maven-jaxb2-pluginを使用して、XSDスキーマファイルからPOJOを作成しています。

ここで、カスタムセッターのようなものを挿入したいと思います。すべての文字列をトリミングし、特定の文字を削除する必要があります。

これを行う方法を知っていますか?


XJBファイル:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">
    <jaxb:bindings schemaLocation="my-schema-xml4.xsd" node="/xs:schema">
        <xjc:javaType name="java.lang.String" adapter="my.StringAdapter" />
    </jaxb:bindings>
</jaxb:bindings>

Javaタイプをバインドするためのソリューション:

<?xml version="1.0" encoding="UTF-8" ?>
<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">
    <bindings schemaLocation="mySchema-xml4.xsd" node="/xs:schema">
        <globalBindings>
            <xjc:javaType name="java.lang.String" xmlType="xs:string"
                adapter="com.name.MyAdapter" />
                    <xjc:javaType name="java.lang.String" xmlType="xs:anySimpleType"
                adapter="com.name.MyAdapter" />
        </globalBindings>
    </bindings>
</bindings>

ただし、プロパティのタイプは。ですが、コンテンツが混在するノードのプロパティに@XmlJavaTypeAdapterはまだ追加されていません。contentjava.lang.String

4

4 に答える 4

1

これを実現する最善の方法は、独自の XmlAdapter を実装し、プロパティのカスタマイズを介して構成することだと思います。これは、標準のjaxb:propertyカスタマイズまたは注釈プラグインを使用して行うことができます。

jaxb:property:

  <jaxb:property>
    <jaxb:baseType>
      <xjc:javaType name="java.lang.String"
        adapter="com.acme.foo.MyAdapter"/>
    </jaxb:baseType>
  </jaxb:property>

注釈プラグイン:

  <annox:annotate target="field">
    <annox:annotate
      annox:class="javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter"
      value="com.acme.foo.MyAdapter"/>
  </annox:annotate>

ここでサンプル プロジェクトを参照してください。

https://svn.java.net/svn/jaxb2-commons~svn/basics/trunk/tests/one/

于 2011-09-07T09:08:11.527 に答える
0

XSD が今後変更されない場合は、POJO を生成し、JAXB プラグインをコメントアウトして、ソースを手動で変更します。

XSD がめったに変更されない場合でも、バージョン管理システムでこのソリューションを使用できます。生成されたソースをコミットし、POJO を変更して、変更をコミットします。次に XSD が変更されたときに、2 つのコミットの間にパッチを生成し、新しい XSD から POJO を生成してパッチを適用します。XSDがほとんど変更されない場合、このソリューションははるかに簡単であることがわかりました。

于 2011-09-10T18:55:40.603 に答える
0

私の意見では、AOP、Pick Spring AOP を使用する必要があります。実際、これはすべての文字列型に適用される一般的なロジックになる可能性があります。これが説得力があると思われる場合は、コードをさらに支援できます

于 2011-09-16T12:07:27.910 に答える
0

別の方法として、StAX を使用しStreamReaderDelegateて、JAXB 実装が XML テキストを受け取る前に XML テキストを操作する方法があります。

デモ

コードは次のようになります。StreamReaderDelegateテキスト イベントから返されたテキストを操作するには、 を実装します。

package forum7329881;

import java.io.FileInputStream;
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.stream.util.StreamReaderDelegate;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        XMLInputFactory xif = XMLInputFactory.newInstance();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream("src/forum7329881/input.xml"));
        xsr = new MyStreamReaderDelegate(xsr);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Customer customer = (Customer) unmarshaller.unmarshal(xsr);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(customer, System.out);
    }

    private static class MyStreamReaderDelegate extends StreamReaderDelegate {

        public MyStreamReaderDelegate(XMLStreamReader xsr) {
            super(xsr);
        }


        @Override
        public String getText() {
            return super.getText().trim();
        }

        @Override
        public char[] getTextCharacters() {
            return getText().toCharArray();
        }

        @Override
        public int getTextLength() {
            return getText().length();
        }

        @Override
        public int getTextStart() {
            return 0;
        }

    }

}

入力.xml

以下は、テキスト ノードに空白を含むサンプル入力です。

<customer Id="1">
    <name>    Jane Doe    </name>
    <address>
        <street>    123 A Street    </street>
    </address>
</customer>

出力

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
    <address>
        <street>123 A Street A</street>
    </address>
    <name>Jane Doe</name>
</customer>

お客様

package forum7329881;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Customer {

    private String name;
    private Address address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

}

住所

package forum7329881;

public class Address {

    private String street;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

}

詳細については

StreamReaderDelegate以下は、大文字と小文字を区別しないアンマーシャリングをサポートするために StAX を使用した、より詳細な例へのリンクです。

于 2011-09-12T13:26:36.193 に答える