在JBoss4上使用EJB注释的BeanNotOfRequiredTypeException

时间:2015-12-27 20:20:16

标签: java spring struts2 annotations ejb

问题:

部署WAR文件时出现以下异常。

Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'campaigner-ejb/SecurityServiceImpl/remote' must be of type [com.campaigner.service.SecurityServiceRemote], but was actually of type [com.sun.proxy.$Proxy172]

我搜索了SO和网络的其余部分以获得答案,但还没有找到答案。

背景:

我正在使用Java5运行JBoss4,因为这是我的托管服务包。 今年晚些时候,我可能会升级这个套餐,但现在不需要考虑。 在使用XDoclet多年后,我终于开始使用注释了。 在这方面,我因此尽可能地尝试不使用任何XML文件,尽管这似乎不可能。 我使用Spring 3.2.13和Struts 2.2.3.1(因为我使用的是Java5)。 我的项目包含多个WAR文件和一个EJB JAR文件。我此时决定不使用一个EAR文件来封装它们。 我已经读过将CGLIB jar包含到我的项目中以及将proxy-target-class =“true”添加到我的一个XML文件中可能会解决这个问题, 但是我无法确定应该去哪个文件。

这是我的Java代码:

@Remote
public interface SecurityServiceRemote extends SecurityService
{
}


@TransactionManagement(value = TransactionManagementType.CONTAINER)
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
@Stateless
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class SecurityServiceImpl extends AbstractCampaignerServiceImpl implements
    SecurityServiceLocal, SecurityServiceRemote
{
}

Struts2操作使用ServiceFactory。请注意,我在这里没有引用类;只有接口。

@Component
public class ServiceFactory
{
  private SecurityServiceRemote       securityService;

  public SecurityServiceRemote getSecurityService() throws ApplicationException
  {
    return securityService;
  }

  @EJB(name = "SecurityServiceImpl", mappedName = "campaigner-ejb/SecurityServiceImpl/remote")
  public void setSecurityService(
    SecurityServiceRemote securityService)
  {
    this.securityService = securityService;
  }
}

以下是我的EJB JAR文件中包含的精简XML文件。

beanRefContent.xml

<beans>  
  <!--
    SpringBeanAutowiringInterceptor needs this file.
    We need SpringBeanAutowiringInterceptor to autowire the EJBs. 
   -->
  <bean
    class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg value="classpath:campaignerContext.xml" />
  </bean>
</beans>

campaignerContext.xml

<beans>
  <context:component-scan base-package="com.campaigner.dao.jpa,com.campaigner.service.impl" />

  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="campaigner" />
  </bean>

  <bean id="em" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
  </bean>
</beans>

以下是我的WAR文件中包含的精简XML文件。

的applicationContext.xml

<beans>
  <context:component-scan base-package="com.campaigner.service" />
</beans>

struts.xml中

<struts>
  <constant name="struts.custom.i18n.resources" value="campaigner_messages" />
  <constant name="struts.convention.action.includeJars" value=".*?/campaigner\-web.*?jar(!/)?"/>
  <constant name="struts.convention.action.fileProtocols" value="jar,zip"/>
  <constant name="struts.convention.default.parent.package" value="convention-tiles"/>

  <package name="convention-tiles" extends="struts-default">
    <result-types>
      <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
    </result-types>
  </package>
</struts>

的web.xml

<web-app>
  <display-name>campaigner</display-name>

  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>campaigner_messages</param-value>
  </context-param>
  <context-param>
    <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
    <param-value>/WEB-INF/tiles.xml</param-value>
  </context-param>

  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <init-param>
      <param-name>actionPackages</param-name>
      <param-value>com.campaigner.web.actions</param-value>
    </init-param>
    <init-param>
      <param-name>struts.devMode</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <listener>
    <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
  </listener>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

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

  <welcome-file-list>
    <welcome-file>/index</welcome-file>
  </welcome-file-list>
</web-app>

0 个答案:

没有答案