当在开发环境或部署到诸如CentOS、Ubuntu等服务器环境时,默认一般安装的是OpenJDK。 框架中使用了JCaptcha作为验证码功能实现,由于此组件只有多年前低版本引用了当时JDK中com.sun.image.codec.jpeg相关API, 而新版本的OpenJDK中已经移除相关API类,因此会抛出相关类找不到的异常。
解决方案:
下载安装新版本Oracle JDK,建议可用直接解压缩版本,然后修改诸如tomcat相关启动脚本,添加JAVA_HOME环境变量指向Oracle JDK; 如果是采用Docker部署模式,可以搜索镜像库(如openweb/oracle-tomcat:8-jre8)或自行构建Tomcat8+Oracle JDK8运行镜像。
在POST提交数据时,ModelAttribute特性会提前把相关对象查询到Hibernate进行托管状态,此时不允许直接变更相关实体对象的主键。
解决方案:
详见 BaseController.initPrepareModel中对于buildDetachedBindingEntity的调用,子类按照需要覆写此方法实现, 如参考 ReimbursementRequestController.buildDetachedBindingEntity :
/**
* 如果编辑提交数据涉及到一对一或一对多关联对象更新处理,则需要返回Detached的对象实例,否则会遇到关联对象主键修改异常
* @param id 实体主键
* @return Detached的对象实例
*/
@Override
protected ReimbursementRequest buildDetachedBindingEntity(Long id) {
return reimbursementRequestService.findDetachedOne(id, "reimbursementRequestItems");
}
默认按照Spring表单便签处理规则,会基于path属性值生成id属性值,在后端AJAX页面加载模式会导致大量dom元素的id值相同, 可能出现潜在的id冲突干扰,浏览器相关工具会抛出id重复的异常。
解决方案:
通过分析AbstractDataBoundFormElementTag#resolveId()源码发现,如果id定义为空白字符串,则会直接返回null从而不生成id属性, 暂时以一种不太优雅的方式解决此问题。
在同一类中进行Transaction或Cache方法调用导致AOP失效的问题,没有理解到这一点常常会让开发人员以为遇到灵异事件, 具体可参考TRANSACTIONS, CACHING AND AOP: UNDERSTANDING PROXY USAGE IN SPRING
解决方案:
不要在同一Service对象调用上述Proxy特性的接口方法,实在需要这样的设计可以考虑把Proxy相关方法剥离到另外的Service类中定义。
经过分析,此问题是由于框架里面用了lombok插件生成getter和setter方法,同时刚好又使用了 @Accessors(chain = true) 注解使其生成链式访问的setter方法, 而 Commons-BeanUtils 做属性拷贝时调用的是void setter方法,所以抛出此异常。
解决方案:
把Entity类上面的 @Accessors(chain = true) 注解删除即可
已知是由于新版本tomcat禁止使用了特殊符号
解决方案:
退回8.5.30以下版本或查询新高版本相关配置启用特殊符号支持
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。