2013-01-18 19 views
5

JacksonJsonProvider non funziona con CXF.Jackson JSON non funziona con CXF

CXF V2.6.0 Jackson v2.1.2 (com.fasterxml.jackson) RESTClient (per le prove)

Io ho il provider configurato come qui di seguito in beans.xml.

<bean id="jacksonMapper" class="com.fasterxml.jackson.databind.ObjectMapper"> 
    <property name="dateFormat"> 
    <bean class="java.text.SimpleDateFormat"> 
    <constructor-arg type="java.lang.String" value="yyyy-MM-dd'T'HH:mm:ss.SSSZ">  </constructor-arg> 
    </bean> 
    </property> 
</bean> 

<bean id="jacksonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"> 
    <property name="mapper" ref="jacksonMapper" /> 
</bean> 

in jaxrs: server di .....>

<jaxrs:providers> 
<ref bean="jaxbProvider" /> 
<ref bean="jacksonProvider" />       
</jaxrs:providers> 

</jaxrs:server> 

L'applicazione viene distribuita senza problemi, dà buona JSON, mentre io do la richiesta come "application/xml" e la risposta come "application/json".

Quando provo a dare JSON in richiesta impostando Content-Type = application/json sto affrontando l'errore 500 Internal Server

La richiesta è sempre registrato nel file di log attraverso CXF-logging.

La richiesta non è affatto di destinazione nella classe di implementazione del servizio del mio webservice.

Il JSON nel corpo della richiesta è:

{"SearchOrdersRequest":{"LoginCredentials":{"AppId":"BookStore","Username":"myuser","Password":"abcd1234","SecurityToken":"Vcvx45YilzX1"},"SearchHeader":{"SearchCategory":"Rep","FilterLogic":"1 AND 2","SearchParams":{"Field":"Order Number (s)","Operator":"EQUALS","Values":"600045335"}}}} 

Qualsiasi aiuto immediato è apprezzato.

risposta

0

Per poter utilizzare libreria di Jackson sovrascrivendo getto, è necessario configurare jacksonprovider come seguire

<bean id="jacksonJsonProvider" class="com.student.CustomJsonProvider"/> 

<jaxrs:providers> 
    <ref bean="jacksonJsonProvider" /> 
</jaxrs:providers> 
3

In CXF documentation, si può vedere dove è necessario aggiungere provider di JSON e includere una dipendenza. Ma ho ancora degli errori quando ho provato ad aggiungere jackson invece di jettison, dopo alcune ore ho capito che è necessario includere un'altra dipendenza di jackson.

  1. Aggiungere fornitore JSON

    <jaxrs:providers> 
        <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" /> 
    </jaxrs:providers> 
    
  2. aggiungere le dipendenze

    <dependency> 
        <groupId>org.codehaus.jackson</groupId> 
        <artifactId>jackson-xc</artifactId> 
        <version>1.9.12</version> 
    </dependency> 
    <dependency> 
        <groupId>org.codehaus.jackson</groupId> 
        <artifactId>jackson-jaxrs</artifactId> 
        <version>1.9.12</version> 
    </dependency> 
    
+2

questo ancora valido dopo 2 anni –

+0

come repleace jaxrs: provider con javaconfig puro (senza xml?) –

2

Come ti ho undertood, l'applicazione produce e consuma XML e JSON formato. Quindi, prima di tutto. Assicurati che il tuo endpoint della risorsa cxf sia in grado di farlo.

@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 

In caso contrario, la richiesta non troverà alcuna implementazione di risorse.(In questi linea a livello di classe o livello di metodo)

Poi, se questo non è sufficiente controllare questo jackson CXF integrazione:

<bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" /> 
<bean id="jsonContextResolver" class="net.sf.gazpachoquest.rest.support.JacksonContextResolver" /> 

anche

<jaxrs:server id="services" address="/"> 
    <jaxrs:providers> 
     <ref bean="jsonProvider" /> 
     <ref bean="jsonContextResolver" /> 
    </jaxrs:providers> 
    </jaxrs:server> 

Il contesto resolver la classe in cui il mapper è definito:

@Provider 
public class JacksonContextResolver implements ContextResolver<ObjectMapper> { 

    private final ObjectMapper mapper = new ObjectMapper(); 

    public JacksonContextResolver() { 
     /* 
     * Register JodaModule to handle Joda DateTime Objects. 
     * https://github.com/FasterXML/jackson-datatype-jsr310 
     */ 
     mapper.registerModule(new JSR310Module()); 
     mapper.setSerializationInclusion(Include.NON_EMPTY); 
     mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 

    } 

    @Override 
    public ObjectMapper getContext(Class<?> arg0) { 
     return mapper; 
    } 
} 

E nel caso in cui si distribuisca l'applicazione in un j2ee cont ainer, potresti richiedere una classe di configurazione dell'applicazione:

@ApplicationPath("/api") 
public class ApplicationConfig extends javax.ws.rs.core.Application{ 

    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> classes = new HashSet<Class<?>>(); 
     // add here your resources 
     classes.add(JacksonContextResolver.class); 
     classes.add(JacksonJsonProvider.class); 
     ... 
     return classes; 
    } 

Spero che questo aiuto.

+0

Salvato la mia giornata! Grazie :) – L01c

+0

NP, prego –

0

In circostanze normali, se si distribuisce a un server EE semplicemente aggiungendo che la dipendenza fornitore doveva essere scoperto e utilizzato automaticamente (ho provato larghezza TomEE 7):

<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>2.8.6 </version> 
</dependency> 

ma attenzione a utilizzare il corretto versione. Guida CFX suggerisce un fornitore Jackson JAX-RS compatibile solo con Jackson 1 e non con Jackson 2. Guarda at that question per ulteriori dettagli

Problemi correlati