1

jax-rs 実装のデフォルトの JSON プロバイダーを置き換えるために、MOXy が JACKSON に似た JSONProvider クラスを提供しないのはなぜでしょうか?

これは、特定のパッケージ内のすべてのクラスを処理する最も簡単な方法です。カスタム コンテキスト リゾルバまたは MessageBodyWriter/Reader は、特定のクラスを処理するのに最も適していますが、特に多くのクラスがある場合は、パッケージ内のすべてのクラスを処理するのには適していないと感じたため、私が最終的に行ったことは次のとおりです。

私は正しいですか?あなたの考えは何ですか?パッケージ内のすべてのクラスを処理するために、Jettison を CXF の MOXy に置き換える最良の方法は何ですか?

import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import org.apache.cxf.jaxrs.provider.json.JSONProvider;
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.eclipse.persistence.jaxb.JAXBContextFactory;

public class MyJSONProvider<T> extends JSONProvider<T> {
    private static JAXBContext jaxbContext = null;
    static {
        try {
            jaxbContext = JAXBContextFactory.createContext("com.bp.bs", null);
        } catch (JAXBException jaxbe) {
            jaxbe.printStackTrace();
            throw new ExceptionInInitializerError(jaxbe);
        }
    }

    @Override
    public void writeTo(T obj, Class<?> cls, Type genericType,
            Annotation[] anns, MediaType m,
            MultivaluedMap<String, Object> headers, OutputStream os)
            throws IOException, WebApplicationException {
        Marshaller marshaller = null;
        try {
            marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(MarshallerProperties.MEDIA_TYPE,
                    "application/json");
            marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
            marshaller.marshal(obj, os);
        } catch (JAXBException jaxbe) {
            jaxbe.printStackTrace();
        }
    }
}
4

1 に答える 1

2

EclipseLink JAXB (MOXy)org.eclipse.persistence.jaxb.rs.MOXyJsonProvider、JSON プロバイダーとして有効にするために使用できるクラスを提供します。

以下は、 を構成する JAX-RS Application クラスの例ですMOXyJsonProvider

package org.example;

import java.util.*;
import javax.ws.rs.core.Application;
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;

public class CustomerApplication  extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>(2);
        set.add(MOXyJsonProvider.class);
        set.add(CustomerService.class);
        return set;
    }

}

MOXyJsonProviderEclipseLink 2.4.0 で追加されました。最新バージョンは EclipseLink 2.4.1 で、次のリンクからダウンロードできます。

詳細については

于 2012-12-23T13:30:37.853 に答える