10

Jersey JAX-RS を使用して Apache TomEE サーバーで実行するコードをアップグレードしています。残念ながら、Jersey を TomEE で使用しようとすると、エラーがスローされます。

私はEclipseを使用しており、JAX-RSプロジェクトファセットをオンにしています。これは、Jersey ライブラリを指しています。また、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 

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 サーバーの使用も検討しますが、Jackson アノテーションを認識しないようです。

編集: 問題は、openEJB CDI が Jersey に付属の CDI と競合していることだと思います。これを修正する方法がわかりません。

4

6 に答える 6

12

復活!誰かがまだこの問題に遭遇している場合に備えて。

私は、Tomcat peachy kene で実行されていたジャージー アプリケーションを持っていて、それを TomEE に移動すると、まさにこのように爆発しました。問題は、TomEE がすでに独自の JAX-RS 実装 (この記事の執筆時点では tomee-jaxrs-1.5.0) を持っていることであり、これが jersey-bundle jar と競合します。

この問題を解決するために私がしなければならなかったことは、ジャージー jar を削除し、web.xml のサーブレット宣言とマッピングをコメントアウトすることだけでした。

再起動して、ビオラ!URL が若干異なることに注意してください。たとえば、デフォルトの jersey インストールではhttp://localhost/rest/represent/me、同じアプリを TomEE に移動すると、http://localhost/represent/me

eclipse のような IDE を使用している場合、jar を見つけることができないために吠えるかもしれません。プロジェクトのプロパティに移動し、ターゲット ランタイムを TomEE に設定するだけです (サーバー インスタンスを追加する必要があります)。行ってもいい。

共有してお楽しみください。

于 2012-11-26T16:30:27.940 に答える
8

私もその正確な例外でこの問題に遭遇しましたが、残念ながらグラウウルフの答えはうまくいきませんでした。

私の場合、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、追加の 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>

その名前が任意であるthat を使用すると、 を渡すServiceことができpath、その時点でデフォルトは になり"additional-lib"ます。渡されたパスはデフォルトで使用されますが、それがディレクトリでない場合は、system.propertiesファイルに追加できるシステム プロパティにフォールバックします。システム プロパティは次のとおりopenejb.enricher.additional-libです。

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

このシステム プロパティは、 に渡されたパスServiceまたはそのデフォルト値が機能しない場合、およびServiceファイルに が配置されている場合にのみチェックされtomee.xmlます。それidは無関係です。

于 2013-06-22T20:19:39.457 に答える
0

Provider クラスのパッケージをパラメーターとしてサーブレットに追加する必要があります。

<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 に答える