JAVA 小白笔记

基础设施

本章记录一些配置笔记,不是 step by step 教程

安装 JAVA

# 免登陆下载java
https://xiandan.io/posts/jdk-download.html
# 高速镜像
https://github.com/LilithBristol/javajdkforwinx64

Linux 环境变量 PATH

%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin

Windows 环境变量

# JAVA_HOME
C:\Program Files\Java\jdk1.8.0_212
# CLASSPATH
.;%JAVA_HOME%\bin;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

VSCode 开发环境

基础插件

安装 Extension Pack for Java 即可,会把用到的开发插件都安装。不需要安装 Java Language Support 会和 Extension Pack for Java 中的 Language Support for Java by Red Hat 冲突。目前使用过程中也没有遇到必须使用 Java Language Support 的情况。

基本使用

使用 CTRL+SHIFT+P 输入 Java: create Project,输入项目名,在 src 文件夹中,选择 Run 运行 Java 代码。

常用快捷键

# 导包
 shift + alt + o

IDEA 开发环境

下载安装 IDEA

Java 集成开发环境 IntelliJ IDEA 2022.3 Ultimate 永久激活版 - 风软资源站

配置 MAVEN,IDEA 中下载速度慢

# IDEA中编辑区右键--maven--create xml
<mirrors>  
    <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>

    <mirror>
        <id>uk</id>
        <mirrorOf>central</mirrorOf>
        <name>Human Readable Name for this Mirror.</name>
        <url>http://uk.maven.org/maven2/</url>
    </mirror>

    <mirror>
        <id>CN</id>
        <name>OSChina Central</name>
        <url>http://maven.oschina.net/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>

    <mirror>
        <id>nexus</id>
        <name>internal nexus repository</name>
        <url>http://repo.maven.apache.org/maven2</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

安装 MYSQL

sudo apt install mysql
sudo mysql -u root -p
source /home/user/oa_system/VBlog/blogserver/src/main/resources/vueblog.sql

常用命令

# 创建数据库
CREATE DATABASE ryvue;
# 切换当前数据库
use ryvue;
set character set utf8;
# 执行sql脚本
source /home/user/oa_system/RuoYi-Vue/sql/ry_20220822.sql
source /home/user/oa_system/RuoYi-Vue/sql/quartz.sql
# 删除数据库
drop database 数据库名;
# 显示所有数据库
show databases;
# 创建数据库
create database 数据库名;
# 显示数据库编码格式
 SHOW VARIABLES LIKE 'character_set_%';
# 删除 mysql 密码
SET PASSWORD FOR root@localhost=PASSWORD('');
# 重建数据库
drop database ryvue;
create database ryvue;
use ryvue;

安装数据库可视化工具

mysql-workbench

echo "deb http://security.ubuntu.com/ubuntu focal-security main" | sudo tee /etc/apt/sources.list.d/focal-security.list
sudo apt-get update
sudo apt-get install libssl1.1

wget https://downloads.mysql.com/archives/get/p/8/file/mysql-workbench-community_8.0.12-1ubuntu18.04_amd64.deb
sudo dpkg -i mysql*.deb 
sudo apt-get install -f 
sudo dpkg -i mysql*.deb  

VSCode 插件-MySQL by weijan Chen

vscode-database-client 官方文档

安装 NPM

sudo apt install npm -y
npm set progress=false 

npm config set registry http://registry.npmjs.org/

npm install --legacy-peer-deps

reify:abbrev: sill audit bulk request
删除 package-lock.json 文件

安装 nvm

打开终端并输入以下命令以在 Ubuntu 上下载 nvm:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

该命令将从 nvm GitHub 存储库下载安装脚本,并使用 bash 在您的 Ubuntu 系统上运行它。运行此命令后,nvm 将被安装在您的家目录中。

安装完成后,在终端中运行以下命令,以使 nvm 生效:

source ~/.bashrc

确认 nvm 是否正确安装:

nvm --version

如果一切顺利,您将看到 nvm 的版本号。

安装 node.js 和 npm

使用 nvm 安装特定版本的 Node.js:

nvm install <node-version>

例如:

nvm install 14.17.6

这将安装 Node.js 版本 14.17.6。

安装完成后,使用以下命令将已安装的 Node.js 版本设置为默认版本:

nvm alias default <node-version>

例如:

nvm alias default 14.17.6

这将设置 Node.js 版本 14.17.6 为默认版本。

确认 Node.js 和 npm 是否正确安装:

node -v
npm -v

如果一切顺利,您将看到 Node.js 和 npm 的版本号。

使用 nvm 切换 Node.js 版本:

使用以下命令查看可用的 Node.js 版本:

nvm ls-remote

该命令将显示可用的 Node.js 版本列表。

使用以下命令安装特定版本的 Node.js:

nvm install <node-version>

例如:

nvm install 12.22.6

这将安装 Node.js 版本 12.22.6。

使用以下命令切换到特定版本的 Node.js:

nvm use <node-version>

例如:

nvm use 12.22.6

这将切换到 Node.js 版本 12.22.6。

确认当前使用的 Node.js 版本:

node -v

如果一切顺利,您将看到当前使用的 Node.js 版本号。

ERROR 合集

Java

Error: Could not find or load main class org.apache.maven.wrapper.MavenWrapperMain

maven 相关依赖还没下载完

JSON parse error: Cannot construct instance of

确认请求方式是 get 还是 post,如果是 post 是不是前端发了一个空串。空串要用{}包裹

Error: JAVA_HOME is not defined correctly

# 缺少.mavenrc 配置文件
vim ~/.mavenrc
# 将 JAVA 配置放进去
export JAVA_HOME=/usr/lib/jvm/jdk1dot8

配置数据表中不存在的字段

@TableField(exist = false)

Error creating bean with name ‘minioController’ endpoint must not be null

检查配置文件是否配置了 endpoint

解决 MyBatis 报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

1、检查 xml 文件的 namespace 是否对应接口,要是全路径。

2、xml 中的函数 id 和接口中的函数名是否对得上,参数类型、返回值类型是否对得上

3、去看输出目录中有没有 xml 映射文件,maven 项目默认把资源文件放在 src/main/resources 下,默认只识别 src/main/resources 下的资源文件。

Unable to obtain LocalDateTime from TemporalAccessor

You can’t parse a date string into LocalDateTime without a time.

LocalDateTime.parse(“2019-10-25”, DateTimeFormatter.ofPattern(“yyyy-MM-dd”))

You should parse the string into LocalDate and call LocalDate.atStartOfDay() to return LocalDateTime with time 00:00:00.

LocalDate.parse(“2019-10-25”, DateTimeFormatter.ofPattern(“yyyy-MM-dd”)).atStartOfDay()

// 传入的时间格式要和解析的时间格式保持一致,如以下解析方式,传入参数  2023-03-08 11:11:11
LocalDateTime startDateTime = LocalDateTime.parse(startTime,
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDateTime endDateTime = LocalDateTime.parse(endTime,
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        DateTimeFormatter localDateFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        
        
 DateTimeFormatter localDateFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  if (!"".equals(startTime) && !"".equals(endTime)) {
      LocalDate startDate = LocalDate.parse(startTime, localDateFmt);
      LocalDate endDate = LocalDate.parse(endTime, localDateFmt);
      LocalDateTime startDateTime = LocalDateTime.of(startDate, LocalTime.MIN);
      LocalDateTime endDateTime = LocalDateTime.of(endDate, LocalTime.MAX);
      log.debug("startDateTime: " + startDateTime);
      log.debug("endDateTime: " + endDateTime);
      queryWrapper.between("create_time", startDateTime, endDateTime);
  }

mybatisplus 提交数据后无法立即被查询到

提升事务隔离级别
@Transactional(isolation = Isolation.READ_UNCOMMITTED)

One record is expected, but the query result is multiple records

解决方案:如果想取一条并不想报错时使用 getOne(queryWrapper,false)

注意 mybatisplus 的 sql 返回值

java.lang.NumberFormatException: null

检查使用 Integer.parseInt 转换时,是否转换的数可能为 null

Unexpected error occurred in scheduled taskjava.lang.NullPointerException: null

服务类没有正确注入,每一个需要注入类都需要添加 Autowire 注解

Unhandled exception type

原因:被强制异常处理的代码块,必须进行异常处理,否则编译器会提示“Unhandled exception type Exception”错误警告。

需要将代码写到 try catch 里!

MySQL

数据库乱码,前端乱码

sudo vim /etc/mysql/my.cnf
# 填写如下配置
[client]
default-character-set=utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true

[mysql]
default-character-set = utf8mb4

nested exception is java.lang.NullPointerException] with root cause

Error attempting to get column ‘motion_id’ from result set

数据库字段类型与后端类型不一致

前端

digital envelope routines::unsupported

export NODE_OPTIONS=--openssl-legacy-provider

禁止跨域策略 (CORS policy)

node: –openssl-legacy-provider is not allowed in NODE_OPTIONS

unset NODE_OPTIONS

Unexpected character (‘}’

请求的时候最后一个字段后面不要加逗号

The value of the ‘Access-Control-Allow-Origin’ header in the response must not be the wildcard ‘*’ when the request’s credentials mode is ‘include’. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute

这个错误通常是因为在使用 XMLHttpRequest 对象进行跨域请求时,服务器返回的响应头中的 Access-Control-Allow-Origin 的值为*,但请求的 withCredentials 属性被设置为 true,这两者之间是相互冲突的。

XMLHttpRequest 对象具有 withCredentials 属性,如果设置为 true,它将在请求中包括来自其他域的 cookie 等凭据信息。但是,如果服务器在响应头中将 Access-Control-Allow-Origin 设置为*,浏览器会禁止访问这些凭据信息。这是一项安全保护措施,防止敏感信息泄露。

解决这个问题的方法是,在服务器端,将 Access-Control-Allow-Origin 设置为请求来源的域名,而不是使用通配符*。这可以让浏览器安全地发送凭据信息。

在前端,需要将 withCredentials 属性设置为 true,以便在请求中包含凭据信息。同时,需要确保请求的来源域名与服务器端设置的 Access-Control-Allow-Origin 一致。

如果你无法更改服务器端的设置,可以考虑使用代理或者 JSONP 等跨域解决方案。

VUE 项目端口不固定

Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘communityInfoController’

检查target/classes/mapper/DepartmentMapper.xml中的格式是否正确,检查引号是否多了,少了

<select id="findIdByOrgId" resultType="resultType="java.lang.Integer">
SELECT CAST(id AS UNSIGNED) AS id FROM department WHERE organization_id = #{orgId}
</select>

错误码

  • 400-前后端参数对不上

{POST/GET} there is already xx bean method

NPM 启动:digital envelope routines::unsupported

export NODE_OPTIONS=--openssl-legacy-provider
npm run serve

The field file exceeds its maximum permitted size of 1048576 bytes

spring boot 上传文件时接口报错 The field file exceeds its maximum permitted size of 1048576 bytes.经排查官方设置每个文件的配置最大为 1Mb,单次请求的文件的总数不能大于 10Mb,上传大于 1Mb 的文件需要修改配置文件(application.properties)
1.Spring Boot 1.3.x 或者之前

multipart.maxFileSize=100Mb
multipart.maxRequestSize=1000Mb

2.Spring Boot 1.4.x 以后

spring.http.multipart.maxFileSize=100Mb
spring.http.multipart.maxRequestSize=1000Mb

3.Spring Boot 2.0 之后

spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=1000MB

字段不存在

请求的时候字段名字和 java 中命名保持一直,而不是和数据库名字保持一样

配置请求超时时间

src/utils/request.js

Request method GET not supported

前端请求事件没有设置请求方式 post 还是 get

Invalid cros request

跨域

处理未来数据

https://www.bilibili.com/video/BV1U44y1W77D?t=1655.5&p=23

TIPS

前端保存代码需要等待一段时间生效

获取用户 IP

String userIp =  request.getRemoteAddr();

解决方案:Java 实体类字段 不返回给前端

@JsonIgnore
@ApiModelProperty(value = "不重要")
@TableField(exist = false)
private String unimportant;

Dateutil 包

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

获取请求参数


public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  //获取请求参数
    String queryString = request.getQueryString();
    log.info("请求参数:{}", queryString);
    }

后端设置 header 前端获取不到

# 必须要加这条字段控制能够获取的 header
        response.addHeader("Access-Control-Expose-Headers","test");
              response.addHeader("test", "sdfdsfdsf");

axios 请求

axios.get('http://opm.eswincomputing.com:9090/user/page')
  .then(function (response) {
    console.log(response.headers);
  })
  .catch(function (error) {
    console.log(error.headers);
  });

查询端口占用

lsof -i
lsof -i:8080:查看 8080 端口占用

打印输出

# Application.yml
logging:
  level:
    com.eswincomputing.springboot: debug
# 使用
@Slf4j
@RestController
@RequestMapping("/patch-record")
public class PatchRecordController {

    @Resource
    private IPatchRecordService patchRecordServic
    log.info(version);
}

校验字符串是否为空

StrUtil.isBlank()

查询主键

SELECT id FROM department WHERE organization_id = #{orgId}

字符整型互转

Integer.parseInt(user.getDelFlag())

解析 json 字符串

   
<!-- json 解析 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.21</version>
</dependency>


   JSONObject object = JSONObject.parseObject(patchRecord.getAttachmentList());
    String fileUID = object.getString("file_uid");
    String fileName = object.getString("file_name");

逗号分割字符串

String string = "张三,李四,王五,马六,小气";
       String substring = string.substring(0, string.length() - 1);
       System.out.println(substring);
       String[] split = substring.split(",");//以逗号分割
       for (String string2 : split) {
           System.out.println("数据-->>>" + string2);
       }