2012-12-22 22 views
1

我想知道爲什麼MOXY不提供類似於JACKSON的JSONProvider類來替換jax-rs實現中的默認JSON提供者?將CXF的JSONProvider(基於Jettison)替換爲MOXy的最佳方式是什麼?

這將是處理某個包中所有類的最簡單方法。 我最終做的是做以下事情,因爲我覺得自定義上下文解析器或MessageBodyWriter/Reader大多適合處理某些類,但不處理包中的所有類,特別是如果您有多個類時。

我對不對? 你有什麼想法? 用CXF中的MOXY替換Jettison以處理包中的所有類的最佳方法是什麼?

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(); 
     } 
    } 
} 

回答

2

EclipseLink JAXB (MOXy)提供了可以用來啓用它的JSON-提供商org.eclipse.persistence.jaxb.rs.MOXyJsonProvider類。

以下是配置MOXyJsonProvider的JAX-RS應用程序類的示例。

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; 
    } 

} 

MOXyJsonProvider是在EclipseLink 2.4.0中添加的。最新的版本是2.4.1的EclipseLink可以從以下網址下載:

更多信息

+1

感謝üSO這和我一直在尋找的一樣!我結束了以下的春季配置: \t \t \t \t <屬性名= 「formattedOutput」 值= 「真」/> \t \t <屬性名= 「includeRoot」 值= 「真」/> \t \t <屬性名= 「marshalEmptyCollections」 值= 「假」/ > \t \t <屬性名= 「valueWrapper」 值= 「$」/> \t \t <屬性名= 「namespaceSeparator」 值= 「」/> \t \t \t' –

相關問題