【问题标题】:Java Restful Web Service using Jersey implementation developed in Eclipse IDE not deployed and call on JBoss server使用在 Eclipse IDE 中开发的 Jersey 实现的 Java Restful Web 服务未部署并在 JBoss 服务器上调用
【发布时间】:2015-11-04 20:01:38
【问题描述】:

我创建了一个使用 Jersey 实现的 Web 服务。在系统中本地使用它时工作正常。但是,当我在 JBoss AS 7 服务器上部署它时会产生问题。不知何故,我通过在 web.xml 文件中添加以下代码解决了这个问题:

<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-name>s1</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>serviceClass</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>s1</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

这个解决了我在 JBoss 服务器上部署服务的问题。但是当我点击我的服务方法时,会出现以下错误:

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet.init() for servlet s1 threw exception
    org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
    java.lang.Thread.run(Thread.java:745)
root cause

java.lang.NoSuchMethodError: com.sun.jersey.core.reflection.ReflectionHelper.getContextClassLoaderPA()Ljava/security/PrivilegedAction;
    com.sun.jersey.spi.scanning.AnnotationScannerListener.<init>(AnnotationScannerListener.java:94)
    com.sun.jersey.spi.scanning.PathProviderScannerListener.<init>(PathProviderScannerListener.java:59)
    com.sun.jersey.api.core.ScanningResourceConfig.init(ScanningResourceConfig.java:79)
    com.sun.jersey.api.core.PackagesResourceConfig.init(PackagesResourceConfig.java:104)
    com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:78)
    com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:89)
    com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:696)
    com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:674)
    com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:205)
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:394)
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:577)
    javax.servlet.GenericServlet.init(GenericServlet.java:242)
    org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
    java.lang.Thread.run(Thread.java:745)

我的服务等级如下:

@Path("/service")
public class Service {

    @GET
    @Path("/getfontlist")
    @Produces({MediaType.APPLICATION_XML   })
    public FontList  getFontList()
    {
        FontList fontList = callMethod.getFontList();
        return fontList;
    }

    @GET
    @Path("/getcolorlist")
    @Produces({MediaType.APPLICATION_JSON })
    public ColorList getColorList()
    {
        ColorList colorList =  callMethod.getColorList();
        return colorList;
    }

    @GET
    @Path("/getproducts")
    @Produces({MediaType.APPLICATION_XML})
    public Categories getProducts()
    {
        Categories productCategoriesList =  callMethod.getProducts();
        return productCategoriesList;
    }

    @GET
    @Path("/getcliparts")
    @Produces({MediaType.APPLICATION_XML })
    public Categories getCliparts()
    {
        Categories clipartCategoriesList = callMethod.getCliparts();
        return clipartCategoriesList;
    }
}

当我使用路径访问服务方法时遇到问题:domain/project_name/service_name/method_name

有人遇到过这个问题吗?如果是,请回复。

提前致谢。

【问题讨论】:

  • 你的包名是否叫做'serviceClass'?这似乎不是一个正常的包名
  • 是的。包名称是 serviceClass。我是否必须更改包名称
  • 每当我看到NoSuchMethodError,首先想到的就是依赖版本问题(这通常是原因)。
  • 我使用的是 jersey 2.0
  • 您是用 Jersey 替换 RESTEasy 还是只是在部署中包含所有 Jersey 库?

标签: java eclipse servlets jboss7.x jersey-2.0


【解决方案1】:

我遇到了类似的问题,这就是它起作用的原因。我不得不在这里浏览很多帖子,其中一直强调需要在 web.xml 中正确设置条目,就我而言,这似乎是问题发生的地方。

这是我的服务类的一部分:

package com.tel.rest.customer;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.bind.annotation.XmlRootElement;

import org.json.JSONException;

import com.sun.jersey.api.JResponse;

@Path("/PR/customers")
@XmlRootElement
public class Customer{...}

web.xml 是这样的:

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>

    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.eteller.rest.customer</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/api/*</url-pattern>
  </servlet-mapping>

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

这是我看到的错误:

13:29:07,921 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/eTellerRest].[Jersey REST Service]] (http--172.25.8.233-8080-3) Allocate exception for servlet Jersey REST Service: com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes.
        at com.sun.jersey.server.impl.application.RootResourceUriRules.<init>(RootResourceUriRules.java:99) [jersey-server-1.19.jar:1.19]
        at com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java:1359) [jersey-server-1.19.jar:1.19]
        at com.sun.jersey.server.impl.application.WebApplicationImpl.access$700(WebApplicationImpl.java:180) [jersey-server-1.19.jar:1.19]
        at com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:799) [jersey-server-1.19.jar:1.19]
        at com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:795) [jersey-server-1.19.jar:1.19]
        at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193) [jersey-core-1.19.jar:1.19]
        at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:795) [jersey-server-1.19.jar:1.19]
        at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:790) [jersey-server-1.19.jar:1.19]
        at com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:509) [jersey-servlet-1.19.jar:1.19]
        at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:339) [jersey-servlet-1.19.jar:1.19]
        at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:605) [jersey-servlet-1.19.jar:1.19]
        at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:207) [jersey-servlet-1.19.jar:1.19]
        at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:394) [jersey-servlet-1.19.jar:1.19]
        at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:577) [jersey-servlet-1.19.jar:1.19]
        at javax.servlet.GenericServlet.init(GenericServlet.java:242) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1202) [jbossweb-7.0.13.Final.jar:]
        at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:952) [jbossweb-7.0.13.Final.jar:]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:188) [jbossweb-7.0.13.Final.jar:]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
        at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
        at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_85]

为了解决这个问题,我必须从 web.xml 中删除这些代码行,以确保 JBoss 可以做它需要做的事情:

    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.eteller.rest.customer</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>

一旦我从我的 web.xml 中删除它,我就能够在我的 JBoss 服务器上部署和使用这些服务。

不确定这是否有帮助,但您可以尝试一下。

问候 阿里。

【讨论】:

  • ali,你能告诉我你为球衣实现添加了什么 jar 文件。这对我有很大的帮助。
  • @Shaun 这里是列表:jackson-core-asl-1.9.2.jar jackson-jaxrs-1.9.2.jar jackson-mapper-asl-1.9.2.jar jackson-xc- 1.9.2.jar java-json.jar jboss-vfs-3.2.9.Final-redhat-1.jar jersey-client-1.19.jar jersey-core-1.19.jar jersey-json-1.19.jar jersey-server- 1.19.jar jersey-servlet-1.19.jar jettison-1.1.jar jsr311-api-1.1.1.jar 希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多