Java 服务端开发笔记

15、更新数据库报错

java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed\n; SQL []; Connection is read-only. Queries leading to data modification are not allowed; nested exception is java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed"

原因是没有加 @Transaction 注解,加上就可以了

14、MySQL 下划线式字段名(如:u_name)与 Java POJO 驼峰式字段名(如:uName)自动映射

环境:Spring Boot + MySQL + MyBatis + *_mapper.xml 配置
application.yml 中增加配置 mybatis.configuration.map-underscore-to-camel-case=true 即可

13、SpringMVC报错:No converter found for return value of type: class java.util.ArrayList

原因:SpringMVC 默认没有提供对象转 json
解决:添加 fastjson 等转换依赖,并在 中配置

    
        
            
                
            
        
    

12、集成 MyBatis 报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

大致是没有找到对应的 Mapper,原因 mapper.xml 的目录名称写成了 com.demo.mapper 这种形式,实际上创建时应该写成 com/demo/mapper,本地是分级的目录,只是在 IDEA 工程中显示为 com.demo.mapper

11、访问 controller 中的方法 404

别忘了在 web.xml 中配置 SpringMVC 的前端控制器 DispatcherServlet

10、Maven 的 tomcat7:run 插件,运行起来之后立即停止

原因:web 项目的打包方式没有修改为 war

9、IDEA package 下右键不能创建 java class

原因:package 名不符合规范,如带有数字,则右键菜单中不会出现创建 java class 选项

8、Spring Boot 项目启动报错

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    ... 48 common frames omitted
Caused by: java.lang.NullPointerException: null
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_241]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_241]
    at com.alibaba.druid.util.JdbcUtils.createDriver(JdbcUtils.java:589) ~[druid-1.1.10.jar:1.1.10]
    at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:817) ~[druid-1.1.10.jar:1.1.10]
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1229) ~[druid-1.1.10.jar:1.1.10]
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1225) ~[druid-1.1.10.jar:1.1.10]
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:90) ~[druid-1.1.10.jar:1.1.10]
    at io.seata.rm.datasource.DataSourceProxy.init(DataSourceProxy.java:66) ~[seata-all-0.7.1.jar:0.7.1]
    at io.seata.rm.datasource.DataSourceProxy.(DataSourceProxy.java:61) ~[seata-all-0.7.1.jar:0.7.1]
    at io.seata.rm.datasource.DataSourceProxy.(DataSourceProxy.java:50) ~[seata-all-0.7.1.jar:0.7.1]
    at com.changgou.goods.config.DataSourceConfiguration.dataSource(DataSourceConfiguration.java:26) ~[classes/:na]
    at com.changgou.goods.config.DataSourceConfiguration$$EnhancerBySpringCGLIB$$38399d80.CGLIB$dataSource$0() ~[classes/:na]
    at com.changgou.goods.config.DataSourceConfiguration$$EnhancerBySpringCGLIB$$38399d80$$FastClassBySpringCGLIB$$4d5ff5c1.invoke() ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at com.changgou.goods.config.DataSourceConfiguration$$EnhancerBySpringCGLIB$$38399d80.dataSource() ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_241]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_241]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_241]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_241]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    ... 49 common frames omitted

Disconnected from the target VM, address: '127.0.0.1:50223', transport: 'socket'

Process finished with exit code 1

原因为配置类的前缀少了druid,修改为

@Bean
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    public DruidDataSource ds0() {
        DruidDataSource druidDataSource = new DruidDataSource();
        return druidDataSource;
    }

参考 http://www.classinstance.cn/detail/111.html

7、访问微服务报错:java.net.SocketException: Can't connect to SOCKS proxy:Connection refused (Connection refused)

原因:应该是开启了代理的缘故,关闭代理、重启服务后恢复正常访问。

6、报错:java.lang.ClassNotFoundException

诡异的问题:Web 项目,在包 abc.def 下定义一个类 AClass,运行正常,然后将包改为 com.abc.def ,类名不变,全限定名为 com.abc.def.AClass,编译没有问题,但是运行时使用到 AClass 时就会报错误 java.lang.ClassNotFoundException: abc.def.AClass. clean 清除缓存也没有作用。后面查看错误日志,调用栈里面有 redis,原来是因为之前有将 abc.def.AClass 数据存入 redis,现在再访问 redis 中的这些数据,因为类已经不存在了,才会报错。解决办法为将 redis 中的数据清除,重新存入和访问。

5、Spring Cloud 微服务之间通过 Feign 调用报错:

feign.FeignException: status 405 reading AddressFeign#list(String)
    at feign.FeignException.errorStatus(FeignException.java:78) ~[feign-core-10.1.0.jar:na]
    at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:93) ~[feign-core-10.1.0.jar:na]
    at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:149) ~[feign-core-10.1.0.jar:na]
    at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:78) ~[feign-core-10.1.0.jar:na]
.......

其中 Feign 接口定义如下:

@GetMapping("/list")
    public Result> list(String username);

以上写法为错误写法,以下是正确写法(增加 @RequestParam("username"))

@GetMapping("/list")
    public Result> list(@RequestParam("username") String username);

原因:Stack Overflow 上的解释

By default, any parameter to a feign method is treated as the body, so your checkFormat() method will send a post because it has a body (a get cannot).

4、Spring Boot 工程中,src/resources/templates 目录下的 .html 文件不能直接通过 url 访问,而需要通过 controller 路径访问。

注意:工程必须添加 thymeleaf 依赖(spring-boot-starter-thymeleaf),否则即使通过 controller 也无法访问!

3、Maven 工程编译遇到以下问题:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project spring_security_demo: Fatal error compiling: 无效的目标发行版: 13 -> [Help 1]
大致是 java 版本不对的问题,本机 java 版本为 1.8,但是设置了所有能设置的 java 版本为 1.8 都没用(包括工程设置及 IDEA 设置),仍然报这个错。后面改了 .pom 文件,添加插件,显式指定 Maven 所使用的 java 编译器版本号为 1.8,才解决问了问题。


      
      
        org.apache.maven.plugins
        maven-compiler-plugin
        3.2
        
          1.8
          1.8
          UTF-8
        
      
 

2、Maven web 项目中运行时找不到 pom.xml 引入的框架中的类

如报错:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
原因是没有把导入的框架放到 WEB-INF 下的 lib 目录。
解决方法:打开 Project Structure,选中 Artifacts,选中项目/模块名,鼠标右键点击右侧 Available Elements 下的模块名,在弹出框中点击 Put into Output Root,这样左侧 WEB-INF 目录下就有了 lib 目录,且包含导入的第三方框架 jar 包。

web_add_lib.jpg

参考:

  • https://www.cnblogs.com/binye-typing/p/6295728.html
  • https://blog.csdn.net/IT_TIfarmer/article/details/84306014
    1)全局修改,$MAVEN_HOME/conf/setting.xml,
    2)仅针对当前用户修改,~/.m2/setting.xml
    取决于 maven 配置使用哪个 xml 文件。
    以 IntelliJ IDEA 为例
    image.png

1、解决:[ERROR] 不再支持源选项 5。请使用 7 或更高版本。

[ERROR] 不再支持目标选项 5。请使用 7 或更高版本。

第一种解决方案:修改工程的 pom.xml 文件

  
    UTF-8
    13
    13
  

其中 13 代表本地 java 版本

第二种方案:修改 Maven 的配置文件 setting.xml。
中添加如下内容

    
      jdk-13
      
        true
        13
      
      
        UTF-8
        13
        13
      
    

你可能感兴趣的:(Java 服务端开发笔记)