从mySSMProject项目中积累的经验

从mySSMProject项目中积累的经验

注意项目中静态资源的导出问题

  • 遇到问题:Mybatis报错 Invalid bound statement (not found)

  • 原因:Maven没有将静态资源导出,target目录下不存在mapper.xml映射文件。

  • 处理方法:在pom.xml中配置<resouirces>进行静态资源导出,代码如下。

  • 总结:当存在静态资源却找不到的时候,想想是不是没有在maven中进行配置过滤。

    <resources>
        <resource>
            <directory>src/main/java</directory>
            <excludes>
                <exclude>**/*.java</exclude>
            </excludes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.*</include>
            </includes>
        </resource>
    </resources>
    

注意 mysqljdbc 8.x 版本需要配置时区(serverTimezone)

  • 遇到问题:Cause: java.sql.SQLException: The server time zone value ‘’ is unrecognized or represents more than one time zone.
  • 原因:mysql8.x的jdbc升级了,增加了时区(serverTimezone)属性,并且不允许为空。
  • 处理方法:在数据库连接<datasource>的url参数后加上?characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai
  • 总结:时区参数可以设置为UTC,但是可能会发生数据库时间不同步的问题,将时区设定为本地时区即可

注意 事务处理

  • 遇到问题:查询有结果,插入返回1,但是数据库查不到值,使用另一个表就可以。
  • 原因:没有正确处理事务,另一个表使用的表类型是MyISAM,这种类型不支持事务。而我的表使用InnoDB类型,这种类型支持事务。在支持事务的情况下,mybatis的配置中,<transactionManager type="managed"/>表示将事务交由外部容器处理。<transactionManager type="JDBC"/>表示使用JdbcTransaction管理事务。
  • 处理方法:将<transactionManager type="JDBC"/>中的JDBC更改为managed,将事务交由外部处理。
  • 总结:当插入遇到问题的时候,考虑测试删除和修改,都不行的话,考虑是事务出问题了。不要想当然,有不懂得就要去查。
<environments default="development">
      <environment id="development">
          <transactionManager type="managed"/>
          <dataSource type="POOLED">
              <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
              <property name="url" value="jdbc:mysql://localhost:3306/mytest?characterEncoding=UTF-8&amp;useSSL=false&amp;serverTimezone=UTC"/>
              <property name="username" value="root"/>
              <property name="password" value="123456"/>
          </dataSource>
      </environment>
  </environments>

注意 Spring中的properties问题

  • 遇到问题:使用Spring+mybatis获取数据库的值时,通过properties方式无法连接数据库,报错Access denied for user ‘Administrator’@‘localhost’ (using password: YES),单独使用mybatis即可使用。验证properties内容无误,更换多个数据源均无效。
  • 原因:properties 中不能用 username 作为变量,这种方式会注入自己的系统环境变量的 用户名,本来是 root ,不应是那个 windows 用户名
  • 处理方法:
  • 总结

注意 Tomcat发布时包的导入问题

  • 遇到问题:部署到Tomcat后进不去Controller,使用JUnit通过Spring方式可以获取到Controller,能够正常使用。各方面代码配置都检查了没有错,更改Springmvc版本也没有用。也配置了导出lib。
  • 原因:导出lib配置错了目录lib应该放在WEB-INF下,之前放在同级了。是通过Tomcat的Log发现ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet,由此注意到应该是导包失败。
  • 处理方法:将lib目录添加到:Project Structure->Artifactes->WEB-INF 中,并导入所有外部包。
  • 总结:多找错误,有问题就会有报错,有报错就能找到方向。

注意 前端传参用的是name属性不是id

  • 遇到问题:前端网页参数传不进去,使用@RequestParam注解后报500错误,找不到参数。
  • 原因:没有给前端元素指定name属性,只使用了id属性。
  • 处理方法:添加name属性。
  • 总结:Java后端与JS要分清楚,到底是使用name还是id。

注意 Maven静态资源过滤

  • 遇到问题:学习Shiro的时候,创建shiro.ini,在JUnit测试中报错:java.io.IOException: Resource [classpath:shiro.ini] could not be found.
  • 原因:Maven静态资源过滤只过滤了.xml和.properties。
  • 处理方法:在过滤中添加.ini过滤,或改成对resources目录全部过滤
  • 总结:当静态资源存在却找不到时,想到Maven的静态资源过滤。

配置Swagger失败

  • 遇到问题:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'objectMapperConfigurer' defined in class path resource [springfox/documentation/spring/web/SpringfoxWebMvcConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [springfox.documentation.spring.web.ObjectMapperConfigurer] from ClassLoader [WebappClassLoader
      context: 
      delegate: false
      repositories:
        /WEB-INF/classes/
    ----------> Parent Classloader:
    java.net.URLClassLoader@6e5e91e4
    ]
    

    在配置过程中总是找不到某些资源,或者无法创建Bean,怀疑是版本不兼容,但是降版本也没有用,找了很久找不出来。将Swagger配置类扫描进Spring就出问题,不注入容器就打不开Swagger-ui页面。

  • 原因:在配置中没有导入spring-tx,导致缺少资源。

  • 处理方法:添加依赖 spring-tx

  • 总结:只配置spring-mvc是不够的,还有tx包和aspectjweaver织入包。

实体类问题

  • 遇到问题:有些数据是多表查询出来的,但是没有承载它们的实体,不知道如何使用。
  • 原因:未建立对应VO实体类。
  • 处理方法:对于多表查询的返回结果,新建VO实体来承接。对于从网页传来的数据使用DTO来承接。
  • 总结:对于多表查询,建立实体类来承载查询结果,并添加相应的<ResultMap>来进行映射,保证字段安全对应。

注意:VO类需要添加新的ResultMap【2021年3月15日】

  • 遇到问题:在查询过程中报Comment类没有username字段,但是使用的是UserComment类,并且从页面到mapper的全过程Idea是可以跳转的。
  • 原因:mapper.xml中配置出错,使用了Comment原来的字段,并且只对Comment进行了查询,所以没有username字段。
  • 处理方法:创建UserCommentMap新的结果映射,连接VO实体与查询结果,并且使用多表查询语句对内容进行查询。
  • 总结:对自己创建的VO类要添加ResultMap进行字段映射,并编写自己的多表查询sql语句来填充VO实体。

注意:Lombok中@Data对equals()和hashCode()方法的重写实现问题

  • 遇到问题:在使用Set集合想要对两个List进行去重的时候,无法实现。
  • 原因:由 Lombok 生成的equals()方法只有在两个对象是同一个对象时,才会返回 true ,否则总为 false ,无论它们的属性是否相同。
  • 处理方法:自己重写equals()和hashCode()方法。
  • 总结:使用lombok的时候,不要继承,当需要判断的时候,要自己重写equals()和hashCode()方法。

注意:fastjson中toJSONString()方法输出空值的问题

  • 遇到问题:在向前端传递json值的时候,会缺少属性,导致前端框架报错。
  • 原因:toJSONString()方法默认序列化方式是不输出数据库中的空值的,需要第二个参数SerializerFeature.WriteMapNullValue来开启空值输出的序列化模式。
  • 处理方法:添加序列化模式,以输出值为null的字段。JSON.toJSONString(users, SerializerFeature.WriteMapNullValue);
  • 总结:在使用JSON的过程中要注意到序列化的问题。

注意:Java转JSON的过程中日期的处理

  • 遇到问题:Java对象转JSON,toJSONString()过来后Date类型值为时间戳,在页面中不能使用。
  • 原因:
  • 处理方法:
  • 总结:

注意:mapper使用注解,取不到DateTime类型值

  • 遇到问题:在 mapper 中使用注解的方式写简单sql语句,取不到 DateTime 的值
  • 原因:是在Mapper中使用注解映射sql语句时没有指定类型,导致类型不一致(可能),在获取数据库中DataTime字段时获取不到。
  • 处理方法:在Mapper中用xml进行映射,使用ResultMap进行字段映射并添加jdbcType属性指定数据库中列的类型。
  • 总结:在需要映射时间等复杂类型的场合下使用xml并定义ResultMap进行映射比较稳妥。

注意:Maven中依赖的作用域问题

  • 遇到问题:
  • 原因:
  • 处理方法:
  • 总结:在项目打成war包时,scope=provided的jar包,不会出现在WEB-INFO/lib目录下,而scope=compile的jar包,会放到WEB-INFO/lib目录。provided表示外部容器提供了这个包,所以打包时不需要这个包。还有runtime、test和system三种作用域。

注意:前端${}取值时,值中存在’:'的问题

  • 遇到问题:Jquery代码失效,任何方法都不起作用,console.log()也不能输出。
  • 原因:在获取路径var path = ${user.icon}时,由于icon的路径中是E:Cxxxx存在盘符加冒号的形式,导致JS出现错误。
  • 处理方法:将${user.icon}使用引号括起来,变成字符串。但是这样又导致了下面的问题,win中是以反斜杠作为路径分隔符的,在字符串中会被转义。
  • 总结:在后端渲染前端的值的时候,要注意后端的值是否会对JS语法造成影响。

注意:windows中分隔符为’\’,直接将路径存入数据库的话再取出来到前端会出现反斜杠转义的问题。

  • 遇到问题:在显示图片的过程中,在前端通过substring函数截取字符串,但是找不到对应的位置。
  • 原因:路径的字符串中存在反斜杠导致字符被转义,找不到需要的files路径名。
  • 处理方法:在后端存入数据库时,将反斜杠全部替换为斜杠。
  • 总结:在win中处理路径时,要注意路径分隔符的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值