2017-02-23 3 views
4

Ich habe eine Anwendung, die Webservices mit Jersey und Jackson als JSON-Anbieter erstellt hat, alles in einem Tomcat-Anwendungsserver.Konfigurieren Sie Wildfly 10, um Jackson (als JSON-Provider) zu verwenden

Ich muss diese Anwendung auf Wildfly 10 arbeiten lassen und alles funktioniert gut, neben der Webservice-Antwort, die die Jackson-Anmerkungen nicht berücksichtigt. Von dem, was ich gelesen habe, verwendete Wildfly Jettison als Standard und in der neueren Version wird Jackson2 verwendet.

Die bevorzugte Lösung wäre, RestEasy (von Wildfly 10) Jackson zu verwenden und dafür versuchte ich Jackson2 und Jettison auszuschließen und eine Abhängigkeit zu Jackson herzustellen (META-INF \ jboss-deployment-structure.xml) , wie unten:

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> 
<deployment> 
    <exclusions> 
     <module name="org.jboss.resteasy.resteasy-jackson2-provider"/> 
     <module name="org.jboss.resteasy.resteasy-jettison-provider"/> 
    </exclusions> 
    <dependencies> 
     <module name="org.jboss.resteasy.resteasy-jackson-provider" services="import"/> 
    </dependencies> 
</deployment> 
</jboss-deployment-structure> 

Offenbar ist dies nicht genug, da verhält sich wie zuvor. Was sollte ich noch versuchen?

UPDATE:

Da meine Anwendung auf beiden Tomcat (mit Jersey) und Wildfly (mit Resteasy) den gleichen Arbeit soll ich nicht mit Jackson von Resteasy in meiner Anwendung verlassen kann, also bin ich m Importieren org.codehaus.jackson.

Also, melde ich meine Anwendung wie folgt aus:

import javax.ws.rs.core.Application; 
public class RestApplication extends Application 
{ 
    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> classes = new HashSet<Class<?>>(); 

     classes.add(RestObjectMapperProvider.class); 
     classes.add(GeneratedService.class); 

     return classes; 
    } 
} 

Und Rest Objekt Mapper Anbieter:

import javax.ws.rs.ext.ContextResolver; 
import javax.ws.rs.ext.Provider; 
import org.codehaus.jackson.map.ObjectMapper; 
@Provider 
public class RestObjectMapperProvider implements ContextResolver<ObjectMapper> 
{ 
    private final ObjectMapper objectMapper; 

    public RestObjectMapperProvider() 
    { 
     this.objectMapper = new ObjectMapper(); 

     this.objectMapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true); 
    } 

    @Override 
    public ObjectMapper getContext(Class<?> type) 
    { 
     return this.objectMapper; 
    } 
} 

Ich baue meine app mit Gradle und unten ist die Jackson Abhängigkeit:

compile group: 'org.codehaus.jackson', name: 'jackson-jaxrs', version: '1.9.+' 

Da unter Tomcat (Jersey) die Annotation in Betracht gezogen werden, wäre meine Vermutung, dass ich Bei Wildfly werden meine Ausschlüsse nicht berücksichtigt. Gibt es eine Möglichkeit, neben der Überprüfung der Antwort zu prüfen, welcher JSON-Anbieter berücksichtigt wurde?

+0

weiterhin Sie Jersey verwenden oder planen Sie Jax-RS/Resteasy über die Verwendung? – teacurran

Antwort

1

Das Update war das setzen Ausschlüsse und die Abhängigkeiten in der Sub-Deployment anstelle von Deployment-Tag, wie ich es tat.

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> 
<sub-deployment name="axis.war"> 
    <exclusions> 
     <module name="org.jboss.resteasy.resteasy-jackson2-provider"/> 
     <module name="org.jboss.resteasy.resteasy-jettison-provider"/> 
    </exclusions> 
    <dependencies> 
     <module name="org.jboss.resteasy.resteasy-jackson-provider" services="import"/> 
    </dependencies> 
</sub-deployment> 

3

Ich bin neugierig, warum Sie Jackson 1.x anstelle von 2.x verwenden? Die Anweisungen sind für beide ähnlich, aber die Jackson-Konfiguration müsste sich ändern. Im Folgenden finden Sie Anweisungen für 1.x.

jboss-Deployment-structure.xml (gleiche wie Sie):

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> 
<deployment> 
    <exclusions> 
     <module name="org.jboss.resteasy.resteasy-jackson2-provider"/> 
     <module name="org.jboss.resteasy.resteasy-jettison-provider"/> 
    </exclusions> 
    <dependencies> 
     <module name="org.jboss.resteasy.resteasy-jackson-provider" services="import"/> 
    </dependencies> 
</deployment> 
</jboss-deployment-structure> 

mit @Application Ihre Anwendung registrieren:

@ApplicationPath("/api/v1") 
public class V1Application extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> classes = new HashSet<Class<?>>(); 

     classes.add(JacksonConfigurationProvider.class); 
     classes.add(TestResource.class); 

     return classes; 
    } 

} 

Verwenden Sie ein jackson Konfiguration Anbieter wie:

@Provider 
@Consumes({MediaType.APPLICATION_JSON, "text/json"}) 
@Produces({MediaType.APPLICATION_JSON, "text/json"}) 
public class JacksonConfigurationProvider extends ResteasyJacksonProvider { 

    private static final Logger LOGGER = LoggerFactory.getLogger(JacksonConfigurationProvider.class); 

    public JacksonConfigurationProvider() { 
     super(); 

     LOGGER.info("loading jackson configurator"); 

     JacksonObjectMapper mapper = JacksonObjectMapper.get(); 
     setMapper(mapper); 

    } 
} 

Dann, in Ihrem JacksonObjectMapper ist, wo Sie es sagen, um die Anmerkungen zu lesen:

public class JacksonObjectMapper extends ObjectMapper { 
    public static JacksonObjectMapper get() { 
     JacksonObjectMapper mapper = new JacksonObjectMapper(); 

     mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true); 
     mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true); 

     JacksonAnnotationIntrospector jacksonAnnotationIntrospector = new JacksonAnnotationIntrospector(); 
     mapper.setDeserializationConfig(mapper.getDeserializationConfig().withAnnotationIntrospector 
       (jacksonAnnotationIntrospector)); 
     mapper.setSerializationConfig(mapper.getSerializationConfig().withAnnotationIntrospector 
       (jacksonAnnotationIntrospector)); 

     return mapper; 
    } 
} 

Mein Jackson Objekt sieht wie folgt aus:

@JsonRootName("foobar") 
public class TestType { 

    @JsonProperty("goodbye") 
    String hello; 

    public String getHello() { 
     return hello; 
    } 

    public void setHello(String hello) { 
     this.hello = hello; 
    } 
} 

Als convienence ich dies auch in meiner web.xml haben, ermöglicht es Ihnen json zu beantragen, indem nur darum.json auf der URL, anstatt Einstellung Header:

<context-param> 
    <param-name>resteasy.media.type.mappings</param-name> 
    <param-value>json : application/json, xml : application/xml</param-value> 
</context-param> 

Als ich http://127.0.0.1:8080/api/v1/test.json nenne ich bekommen:

{ 
    "foobar": { 
     "goodbye": "Here is some random string" 
    } 
} 

ich meinen vollen Arbeits Code hier gepostet habe: https://github.com/teacurran/java-experiments/tree/master/stackoverflow-sandbox/Q42416036

+0

Danke für Ihre Antwort. Ich benutze Jackson1, weil das ist, wie die Anwendung vor langer Zeit zurück entwickelt wurde, ich muss es nur kompatibel mit Wildfly machen mit der Änderung der Anmerkungen – Alin

+0

cool. Hat meine Lösung funktioniert? – teacurran

+0

Leider funktioniert noch nicht. Ich habe meinen Code geteilt (der deinem ähnlich ist) mit der Hoffnung, dass du vielleicht weißt, was falsch ist. Ich vermute, dass die Ausschlüsse nicht berücksichtigt werden, aber ich weiß nicht, wie ich diese Theorie 100% bestätigen kann (neben der REST-Antwort) – Alin

Verwandte Themen