3

ジャージーjavax.xml.bind.annotation.adapters.XmlAdapterのタイプの「システム全体」のカスタムを構成しようとしています。java.util.Locale私が制御するクラスで使用するのは簡単@XmlJavaTypeAdapterですが、常にそうであるとは限りません (注釈を付けることができないサードパーティのコード)。

それはかなり一般的な問題のようですが、それを処理する方法についての良い例やドコが見つかりません。

それで、それは可能ですか?

ありがとう!

4

3 に答える 3

1

私は3つの可能なオプションを見ることができます:

  1. setAdapter()を使用して、コンバーターをマーシャラーに登録します。アプリケーションで使用するすべてのマーシャラーにすべての「システムレベル」タイプのアダプターを追加する静的ビルダー関数を使用できます。それはすべて「システムレベル」の定義に依存します
  2. 代理人を使用する
  3. いくつかの凝ったバイトコードのトリックを実行して、既存のクラスファイルに注釈を追加します。

私のアドバイスは、シンプルでわかりやすいアプローチ1を使用することです。

于 2010-07-10T09:57:55.033 に答える
1

変更できないクラスに注釈を付ける必要がある場合は、 EclipseLink JAXB (MOXy)の外部化されたメタデータ機能をいつでも使用できます。

メタデータ ファイルは次のようになります。

<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm">
    <java-types>
        <java-type name="java.util.Locale">
            <xml-java-type-adapter value="some.package.YourAdapter"/>
        </java-type>
    </java-types>
</xml-bindings>

EclipseLink MOXy では、次のエントリを使用してモデル クラスに jaxb.properties ファイルを追加する必要があります。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
于 2010-07-12T17:45:35.180 に答える
0

同様の目的を意図したJAXBIntroductionsプロジェクトも参照してください。注釈構成は、ソース コードを変更する必要なく、ファイルに保持されます。JAX-RS プロバイダーを実装することで、Jersey とうまく連携します。これについては、例を挙げて詳しく説明している私のブログエントリを参照してください。以下は、Jersey アプリケーションで使用できる JAXBIntroductions 用の単純な JAXBContextResolver 提供です。

import com.sun.xml.bind.api.JAXBRIContext;
import org.jboss.jaxb.intros.IntroductionsAnnotationReader;
import org.jboss.jaxb.intros.IntroductionsConfigParser;
import org.jboss.jaxb.intros.configmodel.JaxbIntros;

import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBContext;
import java.util.*;

@Provider
public class JAXBContextResolverForJAXBIntroductions implements ContextResolver<JAXBContext> {

    private final JAXBContext context;
    private final Set<Class> types;
    private final Class[] cTypes = {Customer.class};

    public JAXBContextResolverForJAXBIntroductions() throws Exception {
        this.types = new HashSet(Arrays.asList(cTypes));
        JaxbIntros config = IntroductionsConfigParser.parseConfig(this.getClass().getResourceAsStream("/intro-config.xml"));
        IntroductionsAnnotationReader reader = new IntroductionsAnnotationReader(config);
        Map<String, Object> jaxbConfig = new HashMap<String, Object>();
        jaxbConfig.put(JAXBRIContext.ANNOTATION_READER, reader);
        this.context = JAXBContext.newInstance(cTypes, jaxbConfig);
    }

    public JAXBContext getContext(Class<?> objectType) {
        return (types.contains(objectType)) ? context : null;
    }
}
于 2011-06-12T23:52:37.800 に答える