1、使用 Mybatis 逆向生成插件时报错:No plugin found for prefix 'mybatis-generator' in the current project and in the plugin groups
在查看相关插件已经导入的情况下,怀疑插件的问题;直接在IDEA命令行输入命令
mvn org.mybatis.generator:mybatis-generator-maven-plugin:1.3.5:generate
其中,1.3.5是generator插件的版本号。 实现成功build
留存:mybatis逆向生成sql语句的xml配置参考:http://mybatis.org/generator/configreference/xmlconfig.html
2、mysql 对于 DATETIME 格式的字段默认值不允许设置为 '0000-00-00 00:00:00'
报错:Invalid default value for 'start_date';
通过下述语句查询 sql_mode 发现出现 “NO_ZERO_IN_DATE
,NO_ZERO_DATE
” 字样
select @@sql_mode;
可见需要修改配置,将这两个条件剔除。
由于我的 MySQL 放在Linux中,配置文件不是去 my.ini 中修改而是在 “/etc/my.cnf” 中添加如下设置后再重启MySQL服务即可。
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
一般来讲大家好像到这儿就成功了,但是我添加上述语句后重启 MySQL直接重启失败,无奈只能将默认值改为 ‘0001-01-01 00:00:00’ 成功。
参考:https://blog.csdn.net/cozil/article/details/88310014
3、HttpSession无法从域中getAttribute。跨域问题
通过上面的debug可以看到 this.attributes 是有将想存的 key-value 存入的,但一从 setAttribute() 中出来,发现 attributes 为 null 了。
此为跨域问题。往setAttribute() 加入的值,getAttribute() 获取不到。两个Session的地址不同,所以Session中的getAttribute() 方法获取的value为null。
解决方案:
1.对应的js的ajax请求中需要添加:(每个ajax中都需要加此属性,以保证session一致)
xhrFields:{withCredentials:true}
2.controller层注解中加入@CrossOrigin及允许访问的ip,设置allowCredentials为true
@CrossOrigin(origins = "http://localhost:63342", allowCredentials = "true",allowedHeaders = "*")
注意低版本的spring boot 支持 origins 为 '*',即允许所有路径访问,但高版本不行启动时会报错,只能再把 localhost 写出来。
参考2。高版本spring boot 不能将 origins 直接写成 '*' 的问题: 参考2
4、使用hibernate validator实现自定义validator校验器与全局捕获异常时报错
4.1)首先由于写了全局异常捕获的代码,所以能被controller层处理的异常都有自己对应的异常错误码和错误信息,处理不了的让ExceptionHandler帮我接收,并将异常命名为UNKNOWN_ERROR即“未知错误”。逻辑如下:
public class BaseController {
public static final String CONTENT_TYPE_FORMED = "application/x-www-form-urlencoded";
//定义exceptionHandler解决未被controller层吸收的exception
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Object handlerException(Exception ex) {
Map<String, Object> responseData = new HashMap<>();
if (ex instanceof BusinessException) { //自行设置的枚举异常类
BusinessException businessException = (BusinessException) ex;
responseData.put("errCode", businessException.getErrCode());
responseData.put("errMsg", businessException.getErrMsg());
} else {
responseData.put("errCode", EmBusinessError.UNKNOWN_ERROR.getErrCode());
responseData.put("errMsg", EmBusinessError.UNKNOWN_ERROR.getErrMsg());
}
return CommonReturnType.create(responseData, "fail");
}
}
其中 @ResponseStatus(HttpStatus.OK) 的含义为:既然内部异常捕获了就告诉前端后台程序部分没有问题,就算有问题也会告诉你错误信息的。
4.2)自定义的validator校验器如下
@Component
public class ValidatorImpl implements InitializingBean {
private Validator validator; //通过 javax 实现的 validator 工具
//实现校验方法并返回校验结果
public ValidationResult validate(Object bean) {
ValidationResult result = new ValidationResult();
Set<ConstraintViolation<Object>> constraintViolationSet = validator.validate(bean); //入参:要校验的bean;出参:若违背校验 set 中就会有值
if (constraintViolationSet.size() > 0) {
//有错误
result.setHasErrors(true);
constraintViolationSet.forEach(constraintViolation ->{
String errMsg = constraintViolation.getMessage(); //违背校验规则的错误信息 + 错误字段
String propertyName = constraintViolation.getPropertyPath().toString();
result.getErrorMsgMap().put(propertyName, errMsg);
});
}
return result;
}
@Override
public void afterPropertiesSet() throws Exception {
//将hibernate validator通过 工厂 的初始化方式使其实例化
this.validator = Validation.buildDefaultValidatorFactory().getValidator();
}
}
其中,实现了InitializingBean接口会自动进行初始化和其他的静态代码块是异曲同工的。
4.3)service层使用自定义的ValidatorImpl 调用 validate() 方法时返回前端“UNKNOWN_ERROR” 即我自定义异常捕获器中最后一层的兜底异常,通过debug进 validate() 方法发现:
invoke()方法抛出invocationtargetexception var4异常
这个异常的意思是原先的内部异常被包装了一下,在查看其他的代码写的没问题的情况下(看大家遇到过的有没写@Param、sql语句写错等),怀疑是validator 依赖冲突的问题。
此时我只引入了
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.4.Final</version> </dependency>
有看到说缺少javax.validation,那再加上
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
走到这儿,问题还是没解决,依旧报上述错误。
解决方案:
将上述两个依赖去除,改为下述依赖即可
<!--校验--> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator-cdi</artifactId> <version>7.0.1.Final</version> </dependency>
参考1:自定义实现Validator:https://www.jianshu.com/p/b3876bf9396c
参考2:依赖问题:https://blog.csdn.net/Lao_gan_ma/article/details/119175862