从 Spring 4.xxx 迁移到 Spring 5,保留 EJB 和 Web 模块

2023-12-03

Hi All

服务器:Websphere 9。

应用程序在 Spring 4 上运行良好。我们希望迁移到 Spring 5。

我们遇到了 DI(依赖注入)的问题。

Spring 4 中有 EJB 模块(带有消息驱动 Bean)和 Web 模块。

我已经知道他们建议完全迁移到 Spring 或使用一些 Spring CDI-Bridge。https://jira.spring.io/browse/SPR-15154

但我们希望避免改变项目的大部分结构(回归测试、少量时间等......)。

那么有什么方法可以保持结构并迁移到 Spring 5。

web.xml

<web-app id="WebAppId" 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">
<display-name>AppWebModule</display-name>

<context-param>
    <param-name>parentContextKey</param-name>
    <param-value>ear.context</param-value>
</context-param>

<context-param>
    <param-name>contextClass</param-name>
    <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<!-- Start Spring MVC -->
<servlet>
    <servlet-name>Spring MVC Dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </init-param>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.organization.services.config.ServicesWebAppConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

... rest of file

服务应用程序配置EJB 模块。

@Configuration
@EnableAspectJAutoProxy
@EnableTransactionManagement(proxyTargetClass = true)
@ComponentScan({ "com.organization.services.resources", "com.organizatio.services.jsf", "com.organizatio.services.snoop", "com.organizatio.services.version" })
public class ServicesWebAppConfig extends WebMvcConfigurationSupport {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.addDefaultHttpMessageConverters(converters); // Have to call this explicitly to register Default Message Converters.
        converters.add(new MappingJackson2HttpMessageConverter());
    }
}

beanRefContext。 XML

   "bean id='ear.context' 
   class='org.spring.....AnnotationConfigApplicationContext
     constructor-arg
        list         
            type="java.lang.Class">com.organization.services.config.ServicesAppConfig
        list
     constructor-arg

Error:

ERROR

   [6/18/18 12:30:57:980 CEST] 0000012c SystemOut     O [2018-06-18 12:30:57,976] 
   [WebContainer : 5] [ERROR] [] 
   [org.springframework.web.servlet.DispatcherServlet:initServletBean:503]: 
   Context initialization failed
   org.springframework.beans.factory.UnsatisfiedDependencyException: Error 
   creating bean with name 'adminResource1': Unsatisfied dependency expressed 
   through field 'adminService'; nested exception is 
   org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying 
   bean of type 'com.organiazation.services.business.admin.xxxx.AdminService' 
   available: expected at least 1 bean which qualifies as autowire candidate. 
   Dependency annotations: {@javax.inject.Inject()}

之前的解决方案在 Spring 5 中不再适用。SpringBean自动装配拦截器支持已removed.

所以这是我的快速解决方案:

我使用 setter 手动将 Spring bean 注入到我的 EJB(此处为 MDB)中。我的 bean“注入”是一个静态 bean(它在 Spring 的初始化阶段设置一次且永久)。

这是我的EJB :

import javax.ejb.*;
import javax.jms.*;

@TransactionManagement(value = TransactionManagementType.CONTAINER)
@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
@MessageDriven(
        name = "messageListenerEJBInstance",
        activationConfig = {
                // configurations ...
        })
public class MessageListenerEJB implements MessageListener {
    // ...
    private static SpringBean springBean;

    @Override
    public void onMessage(Message message) {
        // ...
        
        springBean.someMethod();
        
        // ...
    }

    // ...

    // Setter -> to initialize my bean from the outside
    public void setSpringBean(SpringBean springBean) {
        MessageListenerEJB.springBean = springBean;
    }
}

事情是这样的已初始化 :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">

    // ...

    <bean id="bean" class="your.package.SpringBean"/>
    <bean id="messageListenerEJBInstance" class="your.package.MessageListenerEJB">
        <property name="springBean" ref="bean"/>
    </bean>
    
    // ...
</beans>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Spring 4.xxx 迁移到 Spring 5,保留 EJB 和 Web 模块 的相关文章

随机推荐

  • Google App Engine:如何将大文件写入 Google 云存储

    我正在尝试将大文件从 Google App Engine Blobstore 保存到 Google Cloud Storage 以方便备份 它对于小文件 My code PATH gs backupbucket for df in Docu
  • (全功能)长轮询服务器如何抽象地工作

    由于您使用的是事件循环而不是线程 那么实际的服务器看起来如何 我知道它使用事件循环 但是如何分离请求 如何防止服务器运行速度极慢 我认为它是无线程的 一次只能推送一件事 某种伪代码会很棒 原谅我的无知 当然 如果有地方用非基本的方式解释它
  • 我的 java App Engine 托管 VM 版本在 2015 年 4 月 14 日更新后未部署

    我的 java App Engine 托管虚拟机构建不再使用以下方式进行部署gcloud preview app deploy target myapp SNAPSHOT我明白了 ERROR Found no valid App Engin
  • PyCharm 运行速度很慢

    我是以下的忠实粉丝JetBrains 的 PyCharm但我确实遇到了一些我想也许我会在这里问的问题 它意外挂起 并且这种情况经常发生 总的来说 它对我来说有点慢 我希望获得一些关于如何提高 IDE 性能的提示 通常 当我打开项目时 PyC
  • MongoDB 分片集群中的文档计数错误

    我有一个使用 MongoDB 4 2 的包含三个分片的集群 我有一个集合 用户 before可以检查分片有600000个文档 mongos gt db users count 600000 接下来 我使用常用 命令对其进行分片 第一个数据库
  • Flutter:使用 Dart 检查设备可用存储空间

    如何检查设备存储是否可以在 Flutter 中执行而无需本地执行 我想知道设备是否有足够的存储空间来下载图像 如何实现这一目标 有一个包叫磁盘空间这使您能够准确地获得您正在寻找的信息 你可以这样使用它 import package disk
  • bat 文件替换文本文件中的字符串

    这个问题在 stackoverflow 上被问了很多 但我似乎无法让它发挥作用 任何提示表示赞赏 这是一个文本文件 扩展名 mpl 其中包含需要删除的违规文本 plotsetup ps plotoutput plotfile eps plo
  • 如何确定RNN中神经元的数量?

    我是 RNN 新手 并试图理解它们 由于它需要输入序列 那么神经元的数量应该与序列的大小相同 对吧 那么 如果我们有 10 个时间步长 因此有 10 个不同的输入 那么我们应该有 10 个神经元 对吗 另外 神经元的数量会随着时间的增加而增
  • 如何在 python 中将图像块传输到特定图像的区域内?

    我正在制作一个游戏 我需要将我的对象复制到特定图像的区域内 我不想需要我的表面来传输这些图像 是否可以 我使用的是pygame 如果您能更好地解释您正在尝试做什么 那么将来会更好 因为它会给您更多答案 根据我的理解 你想将一个图像传输到另一
  • 将通过HTTP上传到ASP.NET的文件进一步上传到C#中的FTP服务器

    上传表格
  • jquery ajax 切断 IE 中的响应

    我正在使用jquery 表单插件它使用 jquery ajax 来完成大部分工作 我们有jquery 1 7 2 我们使用它通过 ajax 向服务器发送表单 并返回指示成功的值或返回带有验证错误的表单 我让它在 Firefox 和 Chro
  • Java BigDecimal 三角方法

    我正在开发一个数学解析器 它能够像这样评估字符串 5 b sqrt c 2 我正在使用 ANTLR 进行解析并取得了良好的进展 现在我迷上了Java课程BigDecimal并想 嘿 为什么不考虑这里的精度呢 我的问题是 Java API 没
  • 在 Django 中,如何检查用户是否属于某个组?

    我在 Django 的管理站点中创建了一个自定义组 在我的代码中 我想检查用户是否属于该组 我怎么做 Your User对象链接到Group对象通过一个多对多关系 您可以因此应用filter方法用户组 因此 要检查给定用户是否属于某个组 例
  • 检查迭代器是否有效

    有没有什么方法可以检查迭代器 无论是来自向量 列表 双端队列 是否 仍然 可取消引用 即尚未失效 我一直在使用try catch 但是有没有更直接的方法来做到这一点 示例 这不起作用 list
  • C# 定时器和内存泄漏

    我正在创建一个程序 每 2 秒检查一次目录列表 我希望这个程序能够运行数月而不会泄漏内存或需要任何人机交互 下面的程序有内存泄漏 我仍然不确定10K代表什么 这不是间隔 间隔为2k class Program static void Mai
  • ClearCase 中是否有 RTC 等效的“挂起模式”?

    我发现 RTC 中的 暂停更改设置 非常有用 而且由于我们也在使用 ClearCase 数十个用户 我想知道 ClearCase 中是否也提供该功能 如果不是 它可以由 script trigger hook 生成吗 我们使用UCM 我想解
  • 无法在 igraph 上绘制网络

    我的二进制图基于边缘列表 每个顶点都是股 票市场上的一个股票行情 例如 BARC Barclay s net full phase1 graph edgelist full phase1 directed FALSE V net full
  • 检查是否支持 UIGraphicsBeginImageContextWithOptions

    我正在开发一个 iOS 应用程序 它目前仅适用于 iOS 4 因为我多次使用以下方法 UIGraphicsBeginImageContextWithOptions 此方法仅在 iOS 4 中可用 因此我的应用程序当前崩溃 无法在 iPhon
  • Symfony 3 Twig\Extension\AbstractExtension 在生产模式下未找到错误

    我有一个在开发模式下运行良好的应用程序 但是当我在生产中运行它时会弹出 Fatal error Class Twig Extension AbstractExtension not found in C Users wackm Phpsto
  • 从 Spring 4.xxx 迁移到 Spring 5,保留 EJB 和 Web 模块

    Hi All 服务器 Websphere 9 应用程序在 Spring 4 上运行良好 我们希望迁移到 Spring 5 我们遇到了 DI 依赖注入 的问题 Spring 4 中有 EJB 模块 带有消息驱动 Bean 和 Web 模块 我