143 Star 228 Fork 125

xautlx / s2jh4net

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
295.常见问题.md 3.55 KB
一键复制 编辑 原始数据 按行查看 历史
xautlx 提交于 2018-08-06 19:39 . 2.3.2 / 2018-08-06

常见问题 FAQ

com.sun.image.codec.jpeg 相关异常问题

当在开发环境或部署到诸如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运行镜像。

实体关联对象编辑修改提交时,Hibernate抛出异常提示不能从一个主键修改为另外一个主键

在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 Form Tag中定义id=""是何用意?

默认按照Spring表单便签处理规则,会基于path属性值生成id属性值,在后端AJAX页面加载模式会导致大量dom元素的id值相同, 可能出现潜在的id冲突干扰,浏览器相关工具会抛出id重复的异常。

解决方案:

通过分析AbstractDataBoundFormElementTag#resolveId()源码发现,如果id定义为空白字符串,则会直接返回null从而不生成id属性, 暂时以一种不太优雅的方式解决此问题。

调用Spring的Transaction或Cache方法好像没起作用

在同一类中进行Transaction或Cache方法调用导致AOP失效的问题,没有理解到这一点常常会让开发人员以为遇到灵异事件, 具体可参考linkTRANSACTIONS, CACHING AND AOP: UNDERSTANDING PROXY USAGE IN SPRING

解决方案:

不要在同一Service对象调用上述Proxy特性的接口方法,实在需要这样的设计可以考虑把Proxy相关方法剥离到另外的Service类中定义。

Commons-BeanUtils 组件对Entity对象进行数据拷贝时抛出 no setter method in class

经过分析,此问题是由于框架里面用了lombok插件生成getter和setter方法,同时刚好又使用了 @Accessors(chain = true) 注解使其生成链式访问的setter方法, 而 Commons-BeanUtils 做属性拷贝时调用的是void setter方法,所以抛出此异常。

解决方案:

把Entity类上面的 @Accessors(chain = true) 注解删除即可

Tomcat 抛出异常 java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

已知是由于新版本tomcat禁止使用了特殊符号

解决方案:

退回8.5.30以下版本或查询新高版本相关配置启用特殊符号支持

Java
1
https://gitee.com/xautlx/s2jh4net.git
git@gitee.com:xautlx/s2jh4net.git
xautlx
s2jh4net
s2jh4net
master

搜索帮助