代码之家  ›  专栏  ›  技术社区  ›  Seyed Ali Roshan

wildfly和Jersey多部件功能。班

  •  0
  • Seyed Ali Roshan  · 技术社区  · 8 年前

    我想从tomcat迁移到Wildfly 10.1,所以我创建了一个web应用程序,用于在Wildfly上测试Jersey rest web服务。

    MultiPartFeature.class

    这是我的 ApplicationConfigure.java

    @ApplicationPath("api")
    public class ApplicationConfigure extends ResourceConfig {
    
    
        public ApplicationConfigure() {
    
            register(JacksonJaxbJsonProvider.class);
            register(JacksonFeature.class);
            register(MultiPartFeature.class);
    
            packages(true, "com.example.controllers");
    
        }
    
    }
    

    这是错误(WildFly日志):

    11:18:13,855 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 69) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./wildfly-webapplcation: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./wildfly-webapplcation: java.lang.RuntimeException: RESTEASY003940: Unable to instantiate MessageBodyReader
        at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:85)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
        at org.jboss.threads.JBossThread.run(JBossThread.java:320)
    Caused by: java.lang.RuntimeException: RESTEASY003940: Unable to instantiate MessageBodyReader
        at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1437)
        at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1368)
        at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1290)
        at org.jboss.resteasy.spi.ResteasyProviderFactory.register(ResteasyProviderFactory.java:2438)
        at org.jboss.resteasy.spi.ResteasyProviderFactory.register(ResteasyProviderFactory.java:99)
        at org.jboss.resteasy.util.FeatureContextDelegate.register(FeatureContextDelegate.java:37)
        at org.jboss.resteasy.util.FeatureContextDelegate.register(FeatureContextDelegate.java:12)
        at org.glassfish.jersey.media.multipart.MultiPartFeature.configure(MultiPartFeature.java:65)
        at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1739)
        at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1368)
        at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1290)
        at org.jboss.resteasy.spi.ResteasyDeployment.registration(ResteasyDeployment.java:368)
        at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:250)
        at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:113)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:36)
        at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117)
        at org.wildfly.extension.undertow.security.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:78)
        at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:103)
        at io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:250)
        at io.undertow.servlet.core.ManagedServlet.createServlet(ManagedServlet.java:133)
        at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:546)
        at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:517)
        at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
        at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
        at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
        at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
        at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
        at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
        at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
        at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:559)
        at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:101)
        at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82)
        ... 6 more
    Caused by: java.lang.IllegalArgumentException: RESTEASY003900: Unable to find a public constructor for provider class org.glassfish.jersey.media.multipart.internal.MultiPartReaderServerSide
        at org.jboss.resteasy.spi.ResteasyProviderFactory.createConstructorInjector(ResteasyProviderFactory.java:2255)
        at org.jboss.resteasy.spi.ResteasyProviderFactory.createProviderInstance(ResteasyProviderFactory.java:2244)
        at org.jboss.resteasy.spi.ResteasyProviderFactory.addMessageBodyReader(ResteasyProviderFactory.java:806)
        at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1432)
        ... 37 more
    

    netbeans日志:

    Deploying /usr/local/wildfly-10.1.0.Final/standalone/deployments/wildfly-webapplcation-1.0.war
    "{
        \"WFLYCTL0080: Failed services\" => {\"jboss.undertow.deployment.default-server.default-host./wildfly-webapplcation\" => \"org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./wildfly-webapplcation: java.lang.RuntimeException: RESTEASY003940: Unable to instantiate MessageBodyReader
        Caused by: java.lang.RuntimeException: RESTEASY003940: Unable to instantiate MessageBodyReader
        Caused by: java.lang.IllegalArgumentException: RESTEASY003900: Unable to find a public constructor for provider class org.glassfish.jersey.media.multipart.internal.MultiPartReaderServerSide\"},
        \"WFLYCTL0412: Required services that are not installed:\" => [\"jboss.undertow.deployment.default-server.default-host./wildfly-webapplcation\"],
        \"WFLYCTL0180: Services with missing/unavailable dependencies\" => undefined
    }"
    

    当我移除 多部件功能。班 它部署得很好。

    顺便说一句,这个应用程序在 Tomee 很好地。

    3 回复  |  直到 8 年前
        1
  •  4
  •   Aleh Maksimovich    8 年前

    作为应用服务器,Wildfly提供了自己的JAX-RS规范实现。这里使用的框架是RESTEasy而不是Jersey。

    Caused by: java.lang.RuntimeException: RESTEASY003940: Unable to instantiate MessageBodyReader
        at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1437)
    

    RESTEasy引擎正在尝试启动Jersey的功能,但失败了。JAX-RS实现中没有太多的统一性,因此它们经常不兼容。

    1. 从Jersey换成RESTEasy。那里 multipart support 有些不同

    2. 关闭Wildfly对应用程序的RESTEasy扫描,并在内部启动Jersey服务器。网上有很多关于它的文章。不确定哪种方法适用于您的版本。

        2
  •  0
  •   NelsonGon phoxis    7 年前

    我解决了这个问题,通过手动调用 JerseyClientBuilder().build() 而不是 ClientBuilder().build() .

    jersey客户端似乎是默认客户端,因此如果您定义了另一个客户端,则它将是由 ClientBuilder()。生成() .

        3
  •  0
  •   Prasanth Rajendran    5 年前

    1、服务器级更改:

    在我的 web.xml 添加以下条目以消除 resteasy

        <context-param>
            <param-name>resteasy.scan</param-name>
            <param-value>false</param-value>
        </context-param>
        <context-param>
            <param-name>resteasy.scan.providers</param-name>
            <param-value>false</param-value>
        </context-param>
        <context-param>
            <param-name>resteasy.scan.resources</param-name>
            <param-value>false</param-value>
        </context-param>
    

    在我的servlet部分添加了以下提供者

        <servlet>
             ....
             ....
            <init-param>
              <param-name>jersey.config.server.provider.classnames</param-name>
              <param-value>
                com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider,
                org.glassfish.jersey.media.multipart.MultiPartFeature
              </param-value>
            </init-param>      
            ....
            ....
        </servlet>
    

    2、客户级变更:

    在升级过程中,我刚刚更改了与客户端相关的类包,从 com.sun.jersey.api.client org.glassfish.jersey.client 并且假设所有glassfish jersey的默认提供者都将在客户端实例化期间注册,而不是 org.jboss.resteasy.spi.ResteasyProviderFactory 初始化,主要原因是,我使用了 Client client = Client.create(); 创建客户端。此外,在问题发生后,将前面提到的客户端创建更改为下面的代码段,这导致了一个问题

    Client client = ClientBuilder.newClient();
    WebTarget webResource = client.target(url);
    ClientResponse response = webResource.path(path).request("application/json")
                                     .header("Content-Type", "application/json;charset=UTF-8")
                                     .put(Entity.json(json), ClientResponse.class);
    
    if (response.getStatus() < 200 || response.getStatus() > 299) {
        throw new CustomException("HTTP Status: " + response.getStatus());
    }
    String responseInString = response.readEntity(String.class);
    
    

    Json解析问题是由于该方法引起的 org.glassfish.jersey.client.JerseyInvocation#translate javax.ws.rs.ext.MessageBodyReader 对于javax以外的类型。ws。rs.core。响应“”。

    最后,通过完全采用Jersey家族客户端类解决了上述问题。

    工作客户:

    JerseyClient client = JerseyClientBuilder.createClient()
                                          .register(JacksonFeature.withoutExceptionMappers());
    JerseyWebTarget webResource = client.target(url);
    Response response = webResource.path(path).request("application/json")
                                    .header("Content-Type", "application/json;charset=UTF-8")
                                    .put(Entity.json(json), Response.class);
    
    if (response.getStatus() < 200 || response.getStatus() > 299) {
        throw new CustomException("HTTP Status: " + response.getStatus());
    }
    String responseInString = response.readEntity(String.class);