问题:
部署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>