10

我正在升级使用 Jersey JAX-RS 在 Apache TomEE 服务器上运行的代码。不幸的是,当我尝试将 Jersey 与 TomEE 一起使用时,它会引发错误。

我正在使用 eclipse 并打开了 JAX-RS 项目方面。它指向泽西图书馆。我也将 Jersey 库移到 /lib/ 目录中,试图解决问题,但无济于事。服务器抛出以下错误:

May 14, 2012 6:26:44 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Provider classes found:
class org.codehaus.jackson.jaxrs.JsonParseExceptionMapper
class org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider
class org.codehaus.jackson.jaxrs.JsonMappingExceptionMapper
class org.codehaus.jackson.jaxrs.JacksonJsonProvider
May 14, 2012 6:26:44 AM org.apache.catalina.core.ApplicationContext log
SEVERE: StandardWrapper.Throwable
java.lang.RuntimeException: javax.naming.NameNotFoundException: Name [com] is not bound in this Context. Unable to find [com].
at com.sun.jersey.server.impl.cdi.CDIExtension.getInitializedExtension(CDIExtension.java:177)
at com.sun.jersey.server.impl.cdi.CDIComponentProviderFactory.<init>(CDIComponentProviderFactory.java:92)
at com.sun.jersey.server.impl.cdi.CDIComponentProviderFactoryInitializer.initialize(CDIComponentProviderFactoryInitializer.java:75)
at com.sun.jersey.spi.container.servlet.WebComponent.configure(WebComponent.java:576)
at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.configure(ServletContainer.java:311)
at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:608)
at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:210)
at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:373)
at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:556)
at javax.servlet.GenericServlet.init(GenericServlet.java:160)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1266)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1185)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1080)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5015)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5302)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1566)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1556)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.naming.NameNotFoundException: Name [com] is not bound in this Context. Unable to find [com].
at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158)
at javax.naming.InitialContext.lookup(Unknown Source)
at com.sun.jersey.server.impl.cdi.CDIExtension$2.stepInto(CDIExtension.java:290)
at com.sun.jersey.server.impl.cdi.CDIExtension.diveIntoJNDIContext(CDIExtension.java:267)
at com.sun.jersey.server.impl.cdi.CDIExtension.lookupJerseyConfigJNDIContext(CDIExtension.java:287)
at com.sun.jersey.server.impl.cdi.CDIExtension.getInitializedExtension(CDIExtension.java:175)
... 22 more 

网页.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>tomeeTest3</display-name>

  <servlet>
    <description>JAX-RS Tools Generated - Do not modify</description>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/jaxrs/*</url-pattern>
  </servlet-mapping>
</web-app>

有谁知道我如何使这项工作?我还考虑使用 tomEE+ Jax-rs 服务器,但它似乎无法识别 Jackson 注释。

编辑:我认为问题在于 openEJB CDI 与 Jersey 附带的 CDI 冲突。我不知道如何解决这个问题。

4

6 回答 6

12

复活!以防万一有人仍然遇到这个问题。

我有一个在 Tomcat 中运行的 Jersey 应用程序,当我将它移动到 TomEE 时,它就以这种方式爆炸。问题是 TomEE 已经有自己的 JAX-RS 实现(在撰写本文时是 tomee-jaxrs-1.5.0),它与 jersey-bundle jar 冲突。

为了摆脱这个问题,我所要做的就是删除球衣罐子并注释掉 web.xml 中的 servlet 声明和映射

重新启动它,中提琴!请记住,URL 会略有不同。例如,在您可能拥有的默认球衣安装中http://localhost/rest/represent/me,当您将同一个应用程序移至 TomEE 时,它将是http://localhost/represent/me

如果您使用的是像 eclipse 这样的 IDE,它可能会因为找不到 jars 而对您咆哮,只需进入项目属性并将目标运行时设置为 TomEE(您必须添加一个服务器实例),您应该是很好走。

分享和享受。

于 2012-11-26T16:30:27.940 回答
8

我也遇到了这个确切例外的问题,不幸的是,grauwulf 的回答对我不起作用。

就我而言,我有 Tomee+ 1.5.2、Jersey 1.1x,并且我也在使用 Spring 3.x。

修复实际上非常简单:

  1. 找到 Tomeesystem.properties文件({tomee}/conf/system.properties默认情况下)。
  2. 添加com.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager=true

从那里开始,它对我有用。为了给予应有的荣誉,我在这篇文中找到了它。

有趣的是,我还希望避免将我{tomee}/lib的文件夹与我的战争依赖项弄乱,所以我还发现您可以通过修改轻松添加额外的库{tomee}/conf/tomee.xml,并添加以下节点(在根节点内<tomee />):

<tomee>
  <Service
    id="extra-libs-enricher"
    class-name="org.apache.openejb.assembler.classic.enricher.AdditionalLibClassLoaderEnricherObserver">
      path = /path/to/your/libs
  </Service>
</tomee>

有了它Service,它的名字是任意的,你不能传递 a path,此时它默认为"additional-lib". 默认使用传入的路径,但如果不是目录,则会回退到系统属性,可以将其添加到system.properties文件中。系统属性为:openejb.enricher.additional-lib

openejb.enricher.additional-lib=/fallback/path/to/your/libs

Service仅当传递给 的路径或其默认值不起作用并且仅当将 aService放置在tomee.xml文件中时,才检查此系统属性。它id是无关紧要的。

于 2013-06-22T20:19:39.457 回答
1

刚刚遇到这个问题:TomEE + Jersey ......问题是我在 Eclipse 中使用 TomEE“使用工作区元数据”......并且不知何故,当这样配置时,服务器配置错过了 TomEE 配置的几个细节(即conf/system.properties - 我们声明:“com.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager=true”)。当我将其更改为“使用 Tomcat 安装”时,问题就消失了。您可以通过在 Eclipse 中双击 TomEE 服务器并选择“使用 Tomcat 安装”来进行配置,如下图所示:

在此处输入图像描述

于 2013-08-04T20:44:17.217 回答
0

您应该将 Provider 类的包作为参数添加到 servlet:

<servlet>
 <servlet-name>ServletAdaptor</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>your.package.name</param-value>
  </init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
 <servlet-name>ServletAdaptor</servlet-name>
 <url-pattern>/jaxrs/*</url-pattern>
</servlet-mapping>

您的提供程序类应如下所示:

package your.package.name;

@Path("/test")
public class StatsServlet {
    @PUT
    @Produces(MediaType.TEXT_HTML)
    public String doPutHtml() {
        return "Hello!";
    }
}
于 2012-05-14T14:32:28.753 回答
0

我追查了它,pickypg是正确的。我能够使用 tomee-maven-plugin 使其与 TomEE 1.5.2 一起使用。我还没有完全弄清楚,但是在球衣发现 java:comp/BeanManager 有一个 bean 管理器并尝试查找上下文之后,就会出现这个问题。

<plugin>
    <groupId>org.apache.openejb.maven</groupId>
    <artifactId>tomee-maven-plugin</artifactId>
    <version>1.0.1</version>
    <configuration>
        <tomeeHttpPort>${http.port}</tomeeHttpPort>
        <tomeeVersion>1.5.2</tomeeVersion>
        <args>-Dcom.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager=true</args>
    </configuration>
</plugin>

这是遇到问题的球衣的摘录。

 public CDIComponentProviderFactory(Object bm, ResourceConfig rc, WebApplication wa) {
        beanManager = (BeanManager)bm;
        // work around proxying bug in Weld
        if (CDIExtension.lookupExtensionInBeanManager) {
            extension = Utils.getInstance(beanManager, CDIExtension.class);
        }
        else {
            // NOTE THIS IS WHAT IS BEING EXECUTED WHEN FLAG IS SET TO FALSE
            extension = CDIExtension.getInitializedExtension();
        }
        extension.setWebApplication(wa);
        extension.setResourceConfig(rc);
    }

/*
 * Returns the instance of CDIExtension that was initialized previously in this same thread, if any.
 */
public static CDIExtension getInitializedExtension() {
    try {
        InitialContext ic = InitialContextHelper.getInitialContext();
        if (ic == null) {
            throw new RuntimeException();
        }
        return (CDIExtension)lookupJerseyConfigJNDIContext(ic).lookup(JNDI_CDIEXTENSION_NAME);
    } catch (NamingException ex) {
        throw new RuntimeException(ex);
    }
}

...

/*
 * Setting this system property to "true" will force use of the BeanManager to look up the bean for the active CDIExtension,
 * rather than going through a thread local.
 */
private static final String LOOKUP_EXTENSION_IN_BEAN_MANAGER_SYSTEM_PROPERTY = "com.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager";

public static final boolean lookupExtensionInBeanManager = getLookupExtensionInBeanManager();

private static boolean getLookupExtensionInBeanManager() {
    return Boolean.parseBoolean(System.getProperty(LOOKUP_EXTENSION_IN_BEAN_MANAGER_SYSTEM_PROPERTY, "false"));
}
于 2013-09-06T23:31:37.827 回答
0

我能够做到这一点,如果有人正在寻找我所做的解决方案

这就是我所做的: * 我使用的是 NetBeans 7.3.1 * 我在 Tomee\conf\system.properties 中添加了以下几行 –>com.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager= true * 我添加了球衣库来自 NetBeans 仅此而已 * 请注意,这些库位于我的应用程序的 WEB-INF\lib 中 * 附加信息如果有人感兴趣,我什至可以将 Mojarra 用于 JSF,我可以告诉你如何

于 2013-10-20T20:24:46.317 回答