SecKill学习初步框架时报错记录

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 写出来。

参考1。注解属性解释及配置方式:参考1.1参考1.2

参考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


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值