Glassfish4 + EJB + Spring,部署失败

时间:2015-08-13 14:01:09

标签: java spring java-ee glassfish ejb

我正在将一个应用程序从Glassfish 3.1.2.2上的Java7升级到Glassfish 4.1上的Java8。该应用程序打包为ear文件,包含带有远程EJB和Spring bean的jar文件,以及带有几个servlet和一些web服务的war文件。

与Glassfish 3.x相比,实际应用只进行了一些细微的更改,所做的总更改是:

  • 使用Java8而不是Java7构建。
  • 部署在Glassfish 4.1而不是3.1.2.2
  • 较新版本的Hibernate
  • 较新版本的ActiveMQ(客户端)

我看不出上一个ear-file和新的ear-file(除了上面提到的lib-jars)之间有什么区别,但是当我尝试部署时,我得到了所有EJB的错误:

org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type SomethingLogic with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject private com.my.application.server.service.SomethingServiceSession.somethingLogic

SomethingService是EJB,SomethingLogic是一个Spring bean。

我的EJB定义如下:

@Stateless
@RolesAllowed("secure")
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class SomethingServiceSession implements SomethingService {

    @Inject
    private SomethingLogic somethingLogic; //Spring bean

SomethingLogic是一个界面。

我有一个beanRefContext.xml,其中包含:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="beanFactory" class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg value="classpath*:applicationContext-glassfish.xml"/>
  </bean>

</beans>

EJB服务在glassfish-ejb-jar.xml中定义,如下所示:

<ejb>
  <ejb-name>SomethingServiceSession</ejb-name>
  <ior-security-config>
    <as-context>
      <auth-method>USERNAME_PASSWORD</auth-method>
      <realm>AD</realm>
      <required>true</required>
    </as-context>
  </ior-security-config>
</ejb>

我尝试将带有以下内容的beans.xml添加到我的EJB项目的resources \ META-INF文件夹中:

<?xml version="1.0"?>
<beans 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://jboss.org/schema/cdi/beans_1_0.xsd" />

没有运气。

我也尝试将@LocalBean添加到我的所有EJB中,也没有运气。

此外,我尝试使用此命令一起禁用CDI:

asadmin set configs.config.server-config.cdi-service.enable-implicit-cdi=false

这实际上允许部署我的EJB服务,但我怀疑它没有被发现的web服务的副作用不那么好,所以我希望能够部署启用CDI来排除这一点。

更新

我尝试在所有非Spring处理的类(EJB,webservices和servlet)中使用@Autowired更改@Inject。现在我得到了实际Spring bean的相同错误。似乎Glassfish在遇到@Inject时会尝试查找EJB bean,无论它们发生在何处。

1 个答案:

答案 0 :(得分:2)

通过将bean-discovery-mode="none"添加到我的各种beans.xml文件来解决我的问题。

    <?xml version="1.0"?>
    <beans 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://jboss.org/schema/cdi/beans_1_2.xsd"
    bean-discovery-mode="none" />