2013-06-04 4 views
0

У меня есть приложение, которое отлично работает на jboss7, оно использует jee6 apis: jax-rs и CDI. Из-за производственных ограничений меня попросили адаптировать его для работы на Jboss 5.1.0. Чтобы все было легко, я создал минимальное приложение, имеющее только одну услугу и одну инъекцию. Он отлично работает на jb7, и мне пришлось добавить libs, которые не были предоставлены для версии jboss5.Weld Servlet не работает при понижении с JBoss AS 7 до JBoss AS 5

jax-rs работал нормально, я добавил RestEasy и объявил серьез RestEasy на web.xml.

Для CDI я включил Weld для работы в режиме сервлета, так как приложение не имеет сервлетов. Следуя документам, я включил слушателя в web.xml, а затем нашел на форуме jboss, что другой слушатель необходим для регистрации BeanContext в jboss jndi.

Так что у меня есть:

<?xml version="1.0" encoding="UTF-8"?> 

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 


    <listener> 
     <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> 
    </listener> 

    <listener> 
     <listener-class>org.jboss.weld.environment.servlet.BeanManagerResourceBindingListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>resteasy-servlet</servlet-name> 
     <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>br.com.bvmf.services.ApplicationConfig</param-value> 
     </init-param> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>resteasy-servlet</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping>  

    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
</web-app> 

Для сборки я использую Gadle, но только чтобы лучше понять, что не я вставляя большинство банок вручную сейчас:

apply plugin: 'java' 
apply plugin: 'eclipse' 
apply plugin: 'war' 

webAppDirName = 'WebContent' 

repositories { 
    mavenCentral() 
    flatDir name:'EasyRestJars',dirs:'libs' 
} 


dependencies { 
    compile(

     [name : 'weld-servlet', version : '2.0.0.SP1-jboss5'], 

     [name : 'jaxrs-api', version : '2.3.6.Final'], 
     [name : 'jackson-core-asl', version : '1.9.9'], 
     [name : 'jackson-jaxrs', version : '1.9.9'], 
     [name : 'jackson-mapper-asl', version : '1.9.9'], 
     [name : 'resteasy-jackson-provider', version : '2.3.6.Final'], 
     [name : 'resteasy-jaxb-provider', version : '2.3.6.Final'], 
     [name : 'resteasy-jaxrs', version : '2.3.6.Final'], 
     [name : 'scannotation', version : '1.0.3'] 
    ) 

    providedCompile(
     [group: 'org.slf4j', name: 'slf4j-api', version: '1.5.6'], 
     [group: 'javaee', name: 'javaee-api', version: '5' ] 
    ) 

    testCompile group: 'junit', name: 'junit', version: '4.+' 

} 


test { 
    systemProperties 'property': 'value' 
} 

war{ 
    exclude 'WEB-INF/lib/*' 
} 

Теперь три класса:

Tha приложение конфигурации просто возвращает сервис:

@ApplicationPath("min") 
public class ApplicationConfig extends Application { 

    @Override 
     public Set<Class<?>> getClasses() { 
     Set<Class<?>> resources = new java.util.HashSet<Class<?>>(); 
      resources.add(br.com.bvmf.services.HelloWorldResource.class); 
      return resources; 
     } 

} 

Компонент, который должен быть введен:

public class HelloProvider {  
    public String getString() {  
     return "Injected Hello"; 
    } 
} 

И сама служба:

@Path("/helloworld") 
public class HelloWorldResource { 

    @Inject 
    private HelloProvider provider; 

    @GET 
    public String getMessage() { 
     //This is where I get a null pointer 
     return provider.getString(); 

    } 
} 

Таким образом, компонент не вводили, только что. Во время развертывания журнала гласит:

2013-06-04 15:24:31,371 INFO [org.jboss.webbeans.bootstrap.WebBeansBootstrap] (HDScanner) Web Beans 1.0.0.PREVIEW1 
2013-06-04 15:24:32,898 INFO [org.jboss.web.tomcat.service.deployers.TomcatDeployment] (HDScanner) deploy, ctxPath=/min-cil-1.0-SNAPSHOT 
2013-06-04 15:24:33,417 INFO [org.jboss.weld.Version] (HDScanner) WELD-000900 2.0.0 (SP1) 
2013-06-04 15:24:33,774 INFO [org.jboss.weld.Bootstrap] (HDScanner) WELD-000101 Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously. 
2013-06-04 15:24:34,485 WARN [org.jboss.weld.Bootstrap] (HDScanner) Legacy deployment metadata provided by the integrator. Certain functionality will not be available. 
2013-06-04 15:24:34,809 INFO [org.jboss.weld.environment.tomcat.Tomcat6Container] (HDScanner) Tomcat 6 detected, CDI injection will be available in Servlets and Filters. Injection into Listeners is not supported 
2013-06-04 15:24:35,750 INFO [org.jboss.weld.environment.servlet.BeanManagerResourceBindingListener] (HDScanner) BeanManager reference bound to java:comp/env/BeanManager 
2013-06-04 15:26:13,648 INFO [org.jboss.resteasy.spi.ResteasyDeployment] (http-127.0.0.1-8080-2) Deploying javax.ws.rs.core.Application: class br.com.bvmf.services.ApplicationConfig 

Существует примечание в weld docs говорят, что: «Кроме того, Weld Servlet поддерживает JBoss EAP 5.1, для этого использовать вариант jboss5 сварного шва Servlet.» Поэтому я нашел эту версию, но это не имело никакого значения (кроме проблем с slf4j).

+0

Любая удача на форумах? – LightGuard

+0

Нет, похоже, Weld не поддерживается на JBoss 5.1 afterall. В итоге я изменил вложение зависимостей на Spring с аннотациями и autwire. Весна играла хорошо с RESTEasy, так что теперь все в порядке. – ciczan

ответ

0

Я не думаю, что есть какая-либо интеграция с JAX-RS в Weld Servlet - это доступно только в Java EE 6. Вы можете посмотреть, как это делается в JBoss AS 6, и попытаться выполнить его резервное копирование? Или посмотрите документы CDI и RESTEasy, чтобы определить, как их добавить (в основном вам нужно зарегистрировать какой-то постструктурированный прослушиватель с RESTEasy, а затем использовать CDI API для ввода экземпляра).

0

Кажется, что Weld не поддерживается на JBoss 5.1 afterall. В итоге я изменил вложение зависимостей на Spring с аннотациями и autwire. Весна играла хорошо с RESTEasy, так что теперь все в порядке.