首页 > 编程语言 >【Java】信创开发(东方通)中台后端项目踩坑小记

【Java】信创开发(东方通)中台后端项目踩坑小记

时间:2023-07-26 18:44:26浏览次数:41  
标签:Web Java tomcat 容器 args hutool 信创 台后 项目

在万事国产化以备世界风云突变之日,我们做软件开发的也不可避免的需要完成一部分信创项目,通常 Web 项目国产化部署的首要选择都是东方通 Web 容器。此次中台项目信创适配过程中踩坑无数,唯独这个坑让我印象深刻念念不忘,接下来就请诸君与我共同复盘一下。

背景:中台项目源于 ruoyi 开源框架,根据公司需要做了一些定制化改造增强。

1.首先,按照惯例进行 war 包打包。

  a.去除项目内置 tomcat依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-tomcat</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

  b.重写启动类,继承 SpringBootServletInitializer 类,重写 configure 方法,Web 容器否则无法检测到启动类

public class MainServletInitializer extends SpringBootServletInitializer
{
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
    {
        return application.sources(MainApplication.class);
    }
}

2.部署项目至东方通容器,具体部署步骤可参见此博客 https://www.cnblogs.com/niway/p/16714894.html

  a 登录东方通中台管理页面

  b.创建虚拟主机与 Http 通道,并相互绑定

  c.部署应用,并绑定虚拟主机

到此为止,基本的部署已经完成。按理说现在可以访问登录页面资源了。但访问页面却出现了一个意料之外的错误。

栈溢出!!!!!!此刻,我有了一种十分不妙的预感。经测试,是获取不到 MVC 视图静态资源等,而接口服务却可以正常提供(登录接口可以使用 Postman 等方式登录,却不能打开登录页面)

查询日志如下:org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError

 

 可见项目是使用 hutool 工具类出现错误,此时我在 tomcat 上部署相同 war 包确认是否打包问题,测试后发现 tomcat 未复现该问题。那么可以确定该问题为东方通 Web 容器与 tomcat 不兼容部分导致的问题。

 

 经过艰难的排查,最终确认访问并没有进入相应的 Controller 控制器。但是 servlet 容器执行 doDispatch 时获取的请求对象(ShiroHttpServletRequest,SysLoginController)都与 tomcat 容器与本地启动时一致。在此处我陷入深深的怀疑与深思,我确定肯定与项目使用 hutool 工具类有关,于是我怀着不必要的希望去查询 hutool 开源社群 isuee 。找到如下问题:https://gitee.com/dromara/hutool/issues/I7M2GZ

此时我已经基本确认,我遇到的问题就是这项,回归项目,在切面中定位到此处代码:

String requestParameter= JSONUtil.toJsonStr(proceedingJoinPoint.getArgs());

该处代码是打印接口调用日志的切面代码,需要将切点参数(接口请求参数)转换为可以打印的 String 字符串,使用了 hutool JSON 工具类中 toJsonStr 方法。但该方法在东方通 Web 容器 7.0.4.9 版本会发生错误,而 tomcat 9.0版本以上则不会出现此类错误,其余版本因未进行测试故不确定:不能转换 HttpServletRequest 对象。

修改代码为:

     String requestParameter;
		Object[] args = proceedingJoinPoint.getArgs();
		if(args.length>=2 && args[0] instanceof HttpServletRequest && args[1] instanceof HttpServletResponse){
			requestParameter = ((HttpServletRequest) args[0]).getRequestURI();
		}else{
			requestParameter= JSONUtil.toJsonStr(args);
		}

至此,中台项目成功启动,登录页面访问成功且能正常登录:

 

标签:Web,Java,tomcat,容器,args,hutool,信创,台后,项目
From: https://www.cnblogs.com/southtwilight/p/java-note_05.html

相关文章

  • java手机号正则
    /**是否有效手机号码@parammobileNum@return*/publicstaticbooleanisMobileNum(StringmobileNum){if(null==mobileNum){returnfalse;}returnmobileNum.matches("^((13[0-9])|(14[0-9])|(19[0-9])|(16[0-9])|(15[^4,\\D])|(17[0-9])|(18......
  • java统计数据库字段
    packagedb;importjava.sql.*;importjava.util.ArrayList;importjava.util.List;/***@Author:dominic**/publicclassStatistic{publicstaticvoidmain(String[]args)throwsSQLException,ClassNotFoundException{Stringa="x......
  • java基础
    注释单行注释//这是单行注释多行注释/*一段*多行注释*/文本注释/****@paramargs*/关键字是被Java语言赋予特殊含义,具有专门用途的单词,比如class,int,double均为Java已经预设好的;组成关键字的字母全部小写,注意String不是关键字;goto与cons......
  • java线程详解
    java线程详解线程概念说到线程,就不得不提进程,为什么呢,因为进程是操作系统进行分配资源和调度的最小单位,比如windows系统安装的应用软件(office、qq、微信等)启动时,由操作系统协调分配资源和调度执行称之为一个进程,进程间是相互独立和隔离的。而线程是进程最小执行单位,一个进程的......
  • 学习Java第6天
    java语法Java注释单行注释://多行注释:/**/文档注释:/***/标识符与关键字java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符标识符注意点所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始首字母以后可以是字母(A-Z或者a-z),......
  • linux更改java版本
    查看系统版本uname-a查看java当前版本whichjavaecho$JAVA_HOME下载新的jdkhttp://www.oracle.com/technetwork/cn/java/javase/downloads解压tar-zxvfjdk-8u181-linux-x64.tar.gz修改JAVA_HOMEvim/etc/profile更新环境source/etc/profile......
  • java主线程等待多个子线程中任意一个有结果后,主线程继续执行
    1.背景2.代码packagecom.qianxingniwo.ls;importorg.junit.Test;importjava.util.concurrent.atomic.AtomicReference;importjava.util.concurrent.locks.LockSupport;/***@Copyright(C)XXXXX技有限公司*@Author:ldp*@Date:2023/7/2615:30*@Descri......
  • Java中代码Bug记录--泛型失效、数组删除、HashMap死循环
    最近在工作的过程中,遇到了不少奇怪自己或者同事的Bug,都是一些出乎意料的,不太容易发现的,记录一下来帮助可能也遇到了这些Bug的人1.编译时泛型校验失效Map<String,String>nameToType=newHashMap<>();nameToType.put("testName",123);//java:不兼容的类型:int无法转......
  • [Java] Stream流求和、排序、分组
    List、Set集合通过Stream流求和一、泛型为Integer、Long、Double、BigDecimal求和Integersum=scores.stream().reduce(Integer::sum).orElse(0);Longsum=scores.stream().reduce(Long::sum).orElse(0L);Doublesum=scores.stream().reduce(Double::sum).orElse(0.00)......
  • JavaScript命令模式:优雅地管理代码
    JavaScript命令模式在JavaScript中,命令模式是一种行为设计模式,它允许我们将请求封装为一个对象,从而使我们能够将请求的不同参数、方法和对象进行参数化。这种模式的主要目的是将请求的发送者和接收者解耦,从而使代码更加灵活和可维护。命令模式的实现在JavaScript中,我们可以使用......