У меня есть приложение, которое отлично работает на 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).
Любая удача на форумах? – LightGuard
Нет, похоже, Weld не поддерживается на JBoss 5.1 afterall. В итоге я изменил вложение зависимостей на Spring с аннотациями и autwire. Весна играла хорошо с RESTEasy, так что теперь все в порядке. – ciczan