Java @spring和AppServer都获取了资源注释

Java @spring和AppServer都获取了资源注释,java,spring,jakarta-ee,annotations,glassfish,Java,Spring,Jakarta Ee,Annotations,Glassfish,我们有一个打包为WAR的Spring3.1MVC应用程序,部署在GlassFish3应用服务器上。该应用程序曾经是基于XML的Spring2,在迁移到Spring3之后,我们慢慢地将其重构为基于注释的IoC配置 该应用程序的核心部分之一是自定义bean工厂,它为远程EJB执行普通JNDI查找。但是,查找的参数存储在外部属性文件中,该文件可以在运行时更改,因此需要自定义工厂。我们还没有找到通过注释配置工厂生产的bean的方法,因此配置仍然是XML格式,如下所示: <bean id="

我们有一个打包为WAR的Spring3.1MVC应用程序,部署在GlassFish3应用服务器上。该应用程序曾经是基于XML的Spring2,在迁移到Spring3之后,我们慢慢地将其重构为基于注释的IoC配置

该应用程序的核心部分之一是自定义bean工厂,它为远程EJB执行普通JNDI查找。但是,查找的参数存储在外部属性文件中,该文件可以在运行时更改,因此需要自定义工厂。我们还没有找到通过注释配置工厂生产的bean的方法,因此配置仍然是XML格式,如下所示:

    <bean id="exampleEjb" factory-method="lookup"
        class="com.example.EjbServiceLocator" lazy-init="false" scope="session">
        <constructor-arg value="example.ejb.connstr" /> <!-- remote hosts: x.y.z.1:3701,x.y.z.2:3701 - cluster here! -->
        <constructor-arg value="example.ejb.name" /> <!-- JNDI name: ejb/example/remoteService -->
        <constructor-arg value="com.example.service.RemoteInterface" /> <!-- this is interface exposed by remote bean -->
        <constructor-arg ref="configReader" /> <!-- custom bean monitoring configuration changes -->
    </bean>

在这里使用工厂意味着容器看到的bean类是
com.example.EjbServiceLocator
,而不是
com.example.service.RemoteInterface
。Autowire by type会混淆,
@Autowire
注释无法将预期类型与
@Qualifier
提供的bean名称匹配。因此,我们必须使用
@Resource(name=“examplejb”)

嗯,这很有效。用一个“但是”。每次(重新)部署应用程序时,应用程序服务器都会扫描存档并尝试自行管理
@Resource
注释。它失败了,在日志中留下丑陋的严重的信息,导致我们支持部门的心率加快

我可以在这里做些什么,以:

  • 防止JavaEE容器扫描应用程序中的类以获取注释
  • @Resource
    注释更改为Java EE容器无法识别的内容
  • 使工厂创建的bean向IoC容器公开正确的类型
  • 关于第1点: 您可以尝试向web.xml文件中的
    webapp
    元素添加
    metadata complete=“true”
    属性,这将防止容器扫描和解析
    @Resource
    注释

    对于第2、3点: 实现可能是一个更好的选择,通过这种方式,您可以使用
    getObjectType()
    api指定期望的确切类型。

    对于第1点: 您可以尝试向web.xml文件中的
    webapp
    元素添加
    metadata complete=“true”
    属性,这将防止容器扫描和解析
    @Resource
    注释

    对于第2、3点:
    实现可能是一个更好的选择,通过这种方式,您可以使用
    getObjectType()
    api指定期望的确切类型。

    浏览此处:浏览此处:谢谢!在Java世界工作了6年,仍在学习基础知识:)我现在已经在web.xml中应用了该属性,另一个技巧对于将来的重构非常有用!谢谢在Java世界工作了6年,仍在学习基础知识:)我现在已经在web.xml中应用了该属性,另一个技巧对于将来的重构非常有用!