Struts 1 到 Spring 迁移 - 策略

2024-05-16

我有一个legacy银行应用程序编码为Struts 1 + JSP现在的要求是迁移后端(目前为 MVC) to Springboot (MVC)。 后续UI(JSP)将迁移到angular.

Caveats

1.) 后端不是无状态的

2.) 会话对象中存储了大量数据

Approach

  1. Have 2个应用程序并行运行 (支柱和弹簧), and 共享会话对象两者之间,将会话存储在数据库、内存(Redis)等中。这意味着大量的代码更改,目前每次更新/获取时,会话都跨 JSP、操作、服务层进行操作

  2. 构建完整的 Spring 应用程序然后让它上线,这又是不可行的,我们不能让用户等待。

  3. 在同一个应用程序中将 Struts 1 和 Spring 结合起来,然后将它们分开,并逐步删除 struts 组件。

Question

在同一个 Web 应用程序中同时使用 Struts 1 和 Spring 是否可行? 可以有 2 个不同的 servlet (ActionServlet & DispatcherServlet一起存在),如果我有 spring 和 struts 的 2 个不同的上下文路径,则可能

目前重点是迁移MVC层,服务层不会成为问题。

另外如果我需要保留后端API设计以支持未来的REST,如果我能这样设计就可能了。

Current

JSP -> Struts 1 MVC -> 服务层 -> 数据库

我们可以建造什么

JSP -> Struts 1 MVC JSON 对象解析器 Spring REST MVC -> 服务层 -> DB

Future

只需删除 JSP -> Struts MVC

Angular(或任何其他框架)-> Spring REST MVC -> 服务层 -> DB


我的朋友,很高兴读到你的问题!我和你一样经历过同样的地狱,使用同样的堆栈......

方法3

老实说我永远不会尝试。原因很简单,我们不希望出现旧项目和新项目相互混合的风险。旧项目中的库很可能与新项目中的库(相同的库,不同版本)发生冲突,然后您需要重构旧代码以允许使用新版本,或者完全更改库。

迁移时,您将希望尽量减少对遗留代码的工作,如果可能的话,甚至不进行任何工作。

方法2

完美的一个,但正如你所说,它无法支付账单。如果你有足够的资金来开发它,那就太好了,那就去做吧,否则,你就……

方法一

绞杀,这对我有用。从工作共享登录开始,然后转向小功能。想象一棵树,你首先删除一些小树枝,然后将它们移动到节点,直到你能够砍掉所有东西。当您删除小功能时,它们应该在新产品上可用(显然您不能中断服务,否则您将采用方法 2)。

更具体地说,我的建议是:

Back-end

1) 使登录正常工作。就我而言,传统的一切都是关于会话的,但我们不希望新产品出现这种情况。因此,我们在登录过程中在遗留代码上实现了一种方法,该方法将从新产品中调用 Oauth 并将登录信息存储在数据库中,就像您提到的那样。原因在我回复的前端部分。

2) 定义您的遗留系统和后端如何共存,以及让它们同时工作的资源(更准确地说是 RAM 和 CPU)。

2.1) 如果万一您的旧产品在带有自定义库的 tomcat 上运行,那么您在不同的上下文中运行新产品时可能会遇到问题。如果发生这种情况,我的建议是使用 Docker(只需仔细查看内存使用情况并确保将其限制在容器上)。

3)从很小的地方开始,替换与创建几乎没有逻辑的新东西相关的功能(小问题,例如用户等),然后转移到具有中等规模逻辑或在遗留产品上确实很难看的东西最终用户日常使用。

4)其余的一切(当我离开公司时,我们还没有进入这个阶段,所以我无法提供太多信息)。

5) 不要将此项目仅仅视为迁移。让页面上的每个人都知道这是一个新产品。不应复制和粘贴旧代码,应使用最佳实践来理解和改进旧代码。

5.1)尽快进行单元和集成测试,如果您的遗留有它们,那就太好了,比较结果以确保您的重构不会破坏任何内容或更改预期输出。这是至关重要的。

前端

1)一旦“统一”登录正常工作,您将能够从新产品加载页面,就好像它们是旧产品的一部分一样(您甚至可以在旧产品的jsp上添加一个框架来加载您的角度页面,我们做到了,它的效果就像一个魅力)。

1.1) 从 UI/UX 的角度来看,拥有新旧页面并不可爱,但它会为最终用户增加价值,并在您将产品发布到生产环境后为您提供反馈。由于您的遗产现在可以访问令牌(或您正在使用的任何身份验证方法,这将是可行的)。

2) 从一开始就定义样式。不要把 UI/UX 的工作推迟到以后(就像我的团队所做的那样)。您越早弄清楚颜色、设计、图标等内容,您在会议上浪费的时间就越少,这些会议本应讨论版本及其影响,但却浪费在讨论“这不是我想要的颜色”或类似的问题上。老实说,先定义 UX,然后再定义 UI,并使其清晰可见。

3)像设计微服务前端一样进行设计。您可能需要花费很多时间才能达到这一点,但是如果您这样做了,那么从新架构迁移到微服务所造成的创伤就会小得多。

Culture

我不知道你们工作场所的文化,但我的工作场所远非完美,思想陈旧的老人进入了他们的舒适区。

改变工作场所文化以适应我们目前市场上的情况,老年人有时倾向于抵制改变,特别是当他们是技术人员并且不更新外面的新事物时。当人们离开公司时,替换他们会变得更加容易(因为人们确实会离开)。

我听说他们仍在尝试运行 Scrum(正如我提到的,我已不再在那里),因此对于定义功能迁移将发生什么以及如何发生的开发人员来说,这是一个巨大的头痛。

这是我的两分钱,希望它们能以某种方式帮助你,祝你好运。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Struts 1 到 Spring 迁移 - 策略 的相关文章

  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • 使用 Checkstyle Plugin 时从插件调用代码时出现问题:“org.eclipse.jface”

    我正在尝试在 Rational Software Architect 7 0 0 4 上使用 eclipse cs 插件 我最近卸载了旧的 beta2 版本并安装了 beta3 插件本身按照之前的配置工作 但是每当我尝试通过 Windows
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • Spring Stomp over Websocket:流式传输大文件

    我的SockJs客户端在网页中 发送帧大小为16K的消息 消息大小限制决定了我可以传输的文件的最大大小 以下是我在文档中找到的内容 Configure the maximum size for an incoming sub protoco
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • 尝试在没有 GatewayIntent 的情况下访问消息内容

    我希望每当我写一条打招呼的消息时 机器人都会在控制台中响应一条消息 但它只是给我一个错误 JDA MainWS ReadThread WARN JDA Attempting to access message content without
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set
  • 如何在种子实体框架版本 6.x 中通过 AddOrUpdate 方法插入身份[重复]

    这个问题在这里已经有答案了 我有一个具有身份列的实体 作为数据种子的一部分 我想对系统中的 标准数据 使用特定的标识符值 我不想禁用身份 只有我想在迁移种子中设置 IDENTITY INSERT ON 我的代码是 protected ove
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮

随机推荐

  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • 验证假名输入

    我正在开发一个允许用户输入日语字符的应用程序 我试图想出一种方法来确定用户的输入是否是日语假名 平假名 片假名或汉字 应用程序中的某些字段不适合输入拉丁文文本 我需要一种方法将某些字段限制为仅限汉字或仅限片假名等 该项目使用UTF 8编码
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • 按一个字段聚合,选择另一个字段最大值的文档作为集合

    使用聚合框架 获取每个分组的字段最大值的文档的最佳方法是什么 因此使用下面的集合 我希望具有为每个具有最新日期的 group id 返回一个文档的功能 第二个清单显示了所需的结果 group id date 1 11 1 12 1 11 2
  • 网格布局:创建 CSS,以便元素在调整相邻元素大小时保持位置

    我想在网格布局中构建一个简单的图像库 并且我正在使用类似的东西悬停时缩放 http www javascript fx com navigation imagezoom general help help html缩放悬停图像 但我宁愿使用
  • 具有 JPA 持久性的 Spring 状态机 - 存储库使用

    我试图弄清楚如何轻松使用 Spring 状态机 包括使用 JPA 进行持久化 这是我正在处理的问题 不兼容的数据类型 工厂和持久性 在程序的某个时刻 我想使用连接到用户的状态机 有用于此目的的存储库 项目spring statemachin
  • 为 Windows Phone 7 创建自定义 InputScope

    在哪里可以找到创建自定义 InputScope 的教程 我想创建一个自定义键盘 在屏幕键盘上仅显示数字 1 9 无符号 您无法创建自定义输入范围 以下是支持的范围输入范围名称值枚举 http msdn microsoft com en us
  • 如何使用 Perl CGI 脚本提供图像?

    我的 Google fu 让我失望了 如何使用 Perl 提供已生成的图像 Example img src getimage pl getimage pl 里有什么 干得好 usr bin perl w my file inner nav
  • 在VS2015中构建项目:“csc.exe”退出,代码为-1073741571

    我使用的是Visual studio 2013 昨天 我安装了VS2015 企业更新3 我的解决方案的构建过程在 VS2015 中的一个项目中崩溃了 VS2017 RC 也会出现同样的异常 该解决方案在 VS2013 中成功构建 该解决方案
  • 为什么函数声明在不同浏览器中的处理方式不同?

    虽然我在谷歌中找不到对此的引用 但我熟悉这样一个事实 在 javascript 中 全局函数声明在执行任何代码之前都会被解释 换句话说 这工作得很好 f function f 但是 我注意到 chrome 和 firefox 对全局函数声明
  • Javascript:我应该隐藏我的实现吗?

    作为一名 C 程序员 我有一个习惯 将可以而且应该私有的东西设为私有 当 JS 类型向我公开其所有私有部分时 我总是有一种奇怪的感觉 而且这种感觉并没有被 唤起 假设我有一个类型draw方法 内部调用drawBackground and d
  • 活动组代码示例

    有人可以给我一些使用活动组的示例代码吗 我的应用程序中有一些按钮 我想将活动应用于这些按钮 目前我正在使用 setVisibility 但我被告知活动组将是更好的选择 这是另一个ActivityGroup 示例项目 http richipa
  • 修改 Twitter 帖子上可编辑 Div 的内容

    我正在编写一个 chrome 扩展 它可以帮助用户在 Twitter 上输入内容 当在 twitter 上写推文时 twitter 会打开一个可编辑的 div 容器 当用户输入内容时 twitter 大概正在使用某些网络框架 会生成子 di
  • 通过 r markdown 中的循环创建代码片段

    如同如何使用R中的knitr创建一个包含代码块和文本的循环 https stackoverflow com questions 36373630 how to create a loop that includes both a code
  • 内置和可加载模块的 __init 和 __exit 宏用法

    我正在阅读有关linux内核开发的内容 我刚刚读了一些我不明白的文字 以下段落讨论了模块的 init 和 exit 宏 这演示了内核 2 2 及更高版本的一个功能 注意变化 在 init 和 cleanup 函数的定义中 init 宏 导致
  • Android 发布到 facebook 墙,stream.publish 几天来就中断了

    我有很多使用 FB android sdk 发布的应用程序 github com facebook facebook android sdk 我所有使用 FB 的应用程序几天后就停止工作了 这必然是 FB 方面的更改或错误 因为我的应用程序
  • Node 不断恢复到旧版本

    每次我在控制台中重新启动 vagrant 时 它都会询问我的登录详细信息 然后说Now using node v7 10 0 npm v4 2 0 当我做run nvm install node I get v13 11 0 is alre
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • Struts 1 到 Spring 迁移 - 策略

    我有一个legacy银行应用程序编码为Struts 1 JSP现在的要求是迁移后端 目前为 MVC to Springboot MVC 后续UI JSP 将迁移到angular Caveats 1 后端不是无状态的 2 会话对象中存储了大量