2017-02-23 9 views
4

私はJerseyとJacksonをJSONプロバイダとして構築したWebサービスをTomcatアプリケーションサーバーに持っています。JacksonをJSONプロバイダとして使用するようにWildfly 10を設定してください

このアプリケーションをWildfly 10で動作させる必要があります。ジャクソンの注釈を考慮していないWebサービスのレスポンスのほか、すべてがうまくいきます。私が読んだことから、WildflyはJettisonをデフォルトとして使用していました。新しいバージョンではJackson2が使用されています。

RestEasy(Wildfly 10)がJacksonを使用するようにすることが推奨されます。このために、Jackson2とJettisonを除外し、Jackson(META-INF \ jboss-deployment-structure.xml)以下のようになります。

明らかに、これは以前と同じように動作しているため、十分ではありません。 他に何を試すべきですか?

UPDATE:私のアプリケーションが(ジャージーを使用して)TomcatとWildfly(RESTEasyのを使用)の両方で同じように動作するはずですので

、私は自分のアプリケーション内のRESTEasyからジャクソンの使用に頼ることができない、ので、私は」輸入org.codehaus.jacksonです。

だから、私はこのように自分のアプリケーションを登録します。

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

、残りのオブジェクトマッピングプロバイダ:

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

私はGradleのと私のアプリを構築し、以下のジャクソンの依存関係ですよ。

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

Tomcat(Jersey)の下でアノテーションが考慮されるため、私の推測はi n Wildfly私の除外は考慮されません。どのJSON Providerを検討したかを確認する方法はありますか?

+0

あなたは、ジャージーを使用し続けているか、JAX-RS/RESTEasyのを使用して計画していますか? – teacurran

答えて

1

修正が入れていました私がやっていたように、配備タグではなく、サブデプロイメントの依存関係と、

<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

2.xの代わりにJackson 1.xを使用しているのはなぜですか?指示は両方の場合に似ていますが、Jackson Configurationを変更する必要があります。以下は1.xの説明です。

のjboss-展開するstructure.xml(あなたと同じ):

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

} 

使用ジャクソン・コンフィギュレーション・プロバイダのように:

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

    } 
} 

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

が@Applicationでアプリケーションを登録します

次に、あなたのJacksonObjectMapperには、注釈を読むように教えてくれるところです:

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

マイ・ジャクソンオブジェクトは次のようになります。私も、私のweb.xmlにこれを持ってconvienenceとして

@JsonRootName("foobar") 
public class TestType { 

    @JsonProperty("goodbye") 
    String hello; 

    public String getHello() { 
     return hello; 
    } 

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

、それはあなただけ入れてJSONを要求することができます。URL上ではなく、ヘッダを設定するJSON:

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

私はhttp://127.0.0.1:8080/api/v1/test.jsonを呼び出すときに私が手:

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

私はここに私の完全な作業コードを掲載している:https://github.com/teacurran/java-experiments/tree/master/stackoverflow-sandbox/Q42416036

+0

あなたの返事をありがとう。私はジャクソン1を使用しています。これは、アプリケーションが長い時間をかけて開発された方法なので、私は野生動詞と互換性を持たせるだけで、注釈を変更することが必要です。 – Alin

+0

私のソリューションは機能しましたか? – teacurran

+0

残念ながら、まだ働いていません。私は自分のコード(あなたのものに似ています)を、間違っているかもしれないという手がかりを持っているとの希望で共有しました。私は除外が考慮されていないと思うが、私はこの理論を100%確認するためにチェックする方法を知らない(REST応答の横にある) – Alin

関連する問題