2013-01-18 16 views
5

JacksonJsonProvider nie działa z CXF.Jackson JSON nie działa z CXF

CXF v2.6.0 Jackson v2.1.2 (com.fasterxml.jackson) RESTClient (do testowania)

mam dostawcy skonfigurowane jak poniżej w 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> 

w jaxrs: serwer .....>

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

</jaxrs:server> 

Aplikacja zostanie wdrożony bez żadnych problemów, to daje dobre JSON natomiast daję wniosek jako "application/xml" i odpowiedzi jako "application/json".

Kiedy próbuję dać JSON na żądanie przez ustawienie Content-type = application/json Mam skierowaną Błąd 500 wewnętrzny serwer

Żądanie jest uzyskiwanie rejestrowane w pliku dziennika thru CXF-logowania.

Żądanie nie występuje w klasie usług w moim serwisie.

JSON na żądanie ciała:

{"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"}}}} 

wszelkiej natychmiastowej pomocy jest doceniana.

Odpowiedz

0

Aby korzystać z biblioteki jackson nadrzędnymi odrzucić, trzeba skonfigurować jacksonprovider jak po

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

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

W CXF documentation można zobaczyć, gdzie trzeba dodać dostawcę json i obejmują zależność. Ale nadal dostaję błędy, gdy próbowałem dodać jacksona zamiast JETTON, po kilku godzinach pomyślałem, że musisz dołączyć jeszcze jedną zależność od Jacksona.

  1. Dodaj dostawcę JSON

    <jaxrs:providers> 
        <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" /> 
    </jaxrs:providers> 
    
  2. Dodaj zależności

    <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

to nadal aktualne po 2 latach –

+0

jak przekierować jaxrs: dostawca z czystym javaconfig (bez xml?) –

2

Jak undertood cię aplikacja produkuje i konsumuje formacie XML i JSON. Przede wszystkim. Upewnij się, że twój punkt końcowy zasobów cxf jest w stanie to zrobić.

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

W przeciwnym razie Twoje żądanie nie znajdzie żadnej implementacji zasobów.(W tych linii na poziomie klasy lub poziomu metody)

A jeśli to nie wystarczy sprawdzić ten jackson CXF Integracja:

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

także

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

kontekście rezolwer klasę gdzie Mapper jest zdefiniowany:

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

I na wszelki wypadek, gdy aplikacja zostanie wdrożona w j2ee cont ainer, możesz potrzebować klasy konfiguracji aplikacji:

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

Mam nadzieję, że ta pomoc.

+0

Uratowałem mój dzień! Dzięki :) – L01c

+0

NP, nie ma za co –

0

W normalnych okolicznościach, jeśli wdrożyć do serwera EE, po prostu dodając, że zależność usługodawca miał być automatycznie wykrywane i wykorzystywane (testowałem szerokość TomEE 7):

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

Ale należy uważać, aby używać odpowiedniego wersja. Przewodnik CFX sugeruje dostawcę Jackson JAX-RS, który jest kompatybilny tylko z Jacksonem 1, a nie z Jacksonem 2. Więcej informacji pod numerem at that question:

Powiązane problemy