我有一个EJB3项目要部署在JBoss 5.1.0 GA上。我将无状态EJB注入到其他无状态bean和Servlet中。
我正在使用没有任何参数的@EJB注释来注入EJB bean,(我有一个测试项目只是为了模拟注入,这有效)。
当我尝试部署时,我得到以下错误。
"Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: Resolution should not happen via injection container"
我已搜索但似乎找不到/查明错误的原因。
更新:1
EJB jar和WAR都部署在同一个EAR中。我正在使用JEE5 archtype http://code.google.com/p/javaee5-maven-archetype/来创建主项目和测试。 archtype生成的默认代码有效,无需在@EJB注入中指定JNDI名称。
更新:2 完整部署堆栈跟踪http://pastebin.com/CknXie13
答案 0 :(得分:4)
这是一个经常被忽视的问题:确保在servlet或Web服务中声明EJB的类类型时使用本地接口的名称而不是实现。因此,JBOSS中的mappedName将指向实现的jndi绑定,而声明中的类类型将指向接口。例如:
@EJB(mappedName="Foo/EmployeeManagerBean/local")
EmployeeManagerLocal manager;
问题#2:确保使用Java 1.6或更高版本进行编译。这在Eclipse中可能很棘手。您必须在Project-> Properties中检查三个位置以确保:Project Facets,编译器合规性设置和构建路径。
答案 1 :(得分:1)
使用@EJB注释的mappedName属性,同时注入servlet
该属性应包含ejb的jndi名称。
答案 2 :(得分:1)
请检查 web.xml 版本。版本2.4或更早版本不支持依赖注入。
以下为 版本=“2.5”的示例摘录
<?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">
您是否将servlet放在.WAR文件中?将您的servlet放在.WAR文件中,将您的bean放在.JAR文件中。创建并传输ear文件然后进行部署
答案 3 :(得分:0)