1

Jersey の機能を使用して、Web サービス メソッドから JSON を生成しようとしています。すべてがうまくいきましたが、オブジェクトのリストの JSON 表現には、ルートタグを囲むようなものが含まれていることがわかりました。JSONConfiguration.natural() を使用して JAXB ベースの JSON サポートを構成すると、望ましい結果が得られることがわかりました。だから私は次のように書いた

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JAXBContextResolver implements ContextResolver<JAXBContext> {

    private final JAXBContext context;

    private final Set<Class> types;

    private final Class[] cTypes = {TrRegion.class};

    public JAXBContextResolver() throws Exception {
        this.types = new HashSet(Arrays.asList(cTypes));
        this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), cTypes);
    }

    @Override
    public JAXBContext getContext(Class<?> objectType) {
        return (types.contains(objectType)) ? context : null;
    }
}

で、このように差し込んで

public class WebServiceApplication extends Application {

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

        resources.add(OrderInfrastructureResource.class);
        resources.add(OrderResource.class);

        resources.add(JAXBContextResolver.class);

        return resources;
    }
}

  <servlet>
    <description>JAX-RS Tools Generated - Do not modify</description>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.[...].WebServiceApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

しかし、何らかの理由で私はいつも得る

java.lang.IllegalStateException: No JAXB provider found for the following JAXB context: class com.sun.xml.bind.v2.runtime.JAXBContextImpl
    at com.sun.jersey.json.impl.JSONHelper.getJaxbProvider(JSONHelper.java:106) [jersey-json-1.17.jar:1.17]    
at com.sun.jersey.json.impl.JSONHelper.getJaxbProvider(JSONHelper.java:106) [jersey-json-1.17.jar:1.17]
at com.sun.jersey.json.impl.DefaultJaxbXmlDocumentStructure.getXmlDocumentStructure(DefaultJaxbXmlDocumentStructure.java:76) [jersey-json-1.17.jar:1.17]
at com.sun.jersey.json.impl.writer.Stax2JacksonWriter.<init>(Stax2JacksonWriter.java:169) [jersey-json-1.17.jar:1.17]
at com.sun.jersey.json.impl.Stax2JsonFactory.createWriter(Stax2JsonFactory.java:105) [jersey-json-1.17.jar:1.17]
at com.sun.jersey.json.impl.provider.entity.JSONListElementProvider.writeList(JSONListElementProvider.java:133) [jersey-json-1.17.jar:1.17]

誰かが理由を教えてもらえますか?

ラインを変えると

this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), cTypes);

this.context = new JSONJAXBContext(JSONConfiguration.mapped().build(), cTypes);

それは動作し始めますが、それを囲むルートタグを与えます (ContextResolver を指定しないのと同じです)。奇妙です(奇妙な意味、違いは私が提供するマッピングタイプだけです)。

Restesy を無効にして Jboss 7.1.1 でアプリを実行しようとしました (行を削除<extension module="org.jboss.as.jaxrs"/><subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>、standalone.xml ファイルから削除しました)。また、Jersey サーブレットとして com.sun.jersey.spi.spring.container.servlet.SpringServlet を使用します。

何が足りないのか教えてください。何が問題なのですか?

4

1 に答える 1

0

com.sun.xml.bindどうやらアプリケーション用の jaxb-impl ライブラリが不足していたようです。そのため、次のように jboss-deployment-structure ファイルにjBoss のモジュールを追加しました。

<dependencies>
  <module name="com.sun.xml.bind" />
  <module name="org.codehaus.jackson.jackson-core-asl" />
  <module name="org.codehaus.jackson.jackson-jaxrs" />
  <module name="org.codehaus.jackson.jackson-mapper-asl" />
  <module name="org.codehaus.jackson.jackson-xc" />
</dependencies>
于 2013-03-05T11:09:29.640 に答える