我升级使用泽西JAX-RS在Apache TomEE服务器上运行代码。 不幸的是,当我尝试使用泽西与TomEE抛出错误。
我使用的Eclipse和有JAX-RS项目方面开启。 它指向泽西图书馆。 我也搬到了新泽西州的库到/ 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
web.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服务器,但它似乎并没有认识到杰克逊的注解。
编辑:我认为这个问题是OpenEJB的CDI与随新泽西CDI冲突。 我不知道如何解决这个问题。
Answer 1:
复活! 万一有人仍在运行到这个问题。
我有在Tomcat的桃色的敏锐运行的应用程序新泽西州和正是这种方式爆炸时我把它它TomEE。 问题是,TomEE已经有了自己的JAX-RS实现(tomee-JAXRS-1.5.0在写这篇文章的时候),这与球衣束罐冲突。
我不得不这样做才能摆脱这个问题是除去球衣罐子和注释掉在web.xml中servlet的声明和映射
给它重新启动,和中提琴! 请记住,网址会略有不同。 例如,在默认安装的球衣,你可能有http://localhost/rest/represent/me
,当你移动相同的应用TomEE这将是http://localhost/represent/me
如果您使用的是IDE如Eclipse它可能在你吠叫不能够找到的罐子,只要进入项目属性和设置目标运行时TomEE(你将不得不增加一个服务器实例),你应该好去。
分享和享受。
Answer 2:
我也遇到了这个问题,准确的例外,可惜grauwulf的回答并没有为我工作。
就我而言,我有Tomee + 1.5.2,新泽西1.1倍,而我也使用Spring 3.x的
整个解决方案其实很简单:
- 找到Tomee
system.properties
文件( {tomee}/conf/system.properties
默认情况下)。 - 添加
com.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager=true
从那里,它只是为我工作。 为了让信用在那里的原因,我发现这个博客帖子 。
有趣的是,我也宁愿避免弄乱我的{tomee}/lib
与我战的依赖性文件夹,所以我还发现,你可以很容易地通过修改添加一个额外的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
,其名称是任意的,你不能传递path
,此时它默认为"additional-lib"
。 该路径通过将默认使用,但如果它不是一个目录,然后它会回落到一个系统属性,它可以被添加到system.properties
文件。 该系统属性是: openejb.enricher.additional-lib
。
openejb.enricher.additional-lib=/fallback/path/to/your/libs
如果传递的路径此系统属性,才检查Service
,或者它的默认值,不能正常工作且仅当Service
被放置在tomee.xml
文件。 它的id
是无关紧要的。
Answer 3:
就在这个问题碰到:TomEE +球衣...问题是,我用TomEE在Eclipse“使用工作区的元数据” ......不知何故,当这样的服务器配置配置错过了TomEE CONFIGS的几个细节(即CONF / system.properties - 我们宣布: “com.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager =真”)。 当我改成了“使用Tomcat安装”,问题就走开了。 您可以通过双击在Eclipse中TomEE服务器进行配置并选择“使用Tomcat安装”,如下图所示:
Answer 4:
您应该添加提供程序类作为参数传递给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!";
}
}
Answer 5:
我跟踪下来,并pickypg是正确的。 我能得到这个使用tomee - Maven的插件与TomEE 1.5.2工作。 我还没有想出确切,但那里是java的一个bean管理的球衣数字后,会出现此问题:补偿/ BeanManager并试图查找上下文。
<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>
下面是它运行到问题的球衣excerts。
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"));
}
Answer 6:
我能做到这一点,如果有人正在寻找解决方案,这就是我所做
这是我做的:*我对使用NetBeans 7.3.1 *我加入Tomee \的conf \ system.properties以下行 - > com.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager =真*我加的球衣库从NetBeans中这是所有*注意库在我的应用程序的WEB-INF \ lib中*额外的信息我甚至用钻嘴鱼科的JSF,如果有人有兴趣,我可以告诉你如何
文章来源: How can I integrate Jersey with TomEE / openEJB