技术整理-开发过程中遇到问题-留存

1.获取前一天的0点到24点的时间,并转换为时间戳
Calendar calendar = Calendar.getInstance();
     calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)-1,0,0,0);
long timeStart = calendar.getTime().getTime();

       calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH),23,59,59);
long timeEnd = calendar.getTime().getTime();
2.将json格式中的List转换为对象
//将获取的data转字符串后再转json,最后将list取出,利用fastjson转换成集合对象
String data = String.valueOf(result.get("data"));
JSONObject jsonObject = JSONObject.parseObject(data);
String callRecordList = JSONArray.toJSONString(jsonObject.get("list"));
List<CallRecordDTO> callRecordDTOS = JSONArray.parseArray(callRecordList, CallRecordDTO.class);
3.base64数据加密
 String base64=Base64.getEncoder().encodeToString(body.toString().getBytes());
4.restTemplate请求

测试用例,通过postForEntity来进行post请求获得整个请求信息,包括响应头、响应体、响应状态

  Student student=new Student();
            student.setName("dwj");
            student.setAge(10);
            HttpHeaders headers=new HttpHeaders();
            headers.setContentType(MediaType.valueOf(String.valueOf(ContentType.JSON)));
            HttpEntity<Student> request=new HttpEntity<>(student,headers);

            RestTemplate restTemplate=new RestTemplate();
            ResponseEntity<Student> responseEntity= restTemplate.postForEntity("http://localhost:8083/workLog/dwj",request,Student.class);

//            System.out.println(responseEntity.toString());

            System.out.println(responseEntity.getBody());
            System.out.println(responseEntity.getStatusCode());
            System.out.println(responseEntity.getStatusCodeValue());
            System.out.println(responseEntity.getHeaders());
5.集合、数组转JSON

记录一下,防止以后忘记,今天在操作集合转json的时候出现了无法转换的问题,最后通过转成字符串结束.

String rq=JSONObject.toJSONString(body);
6.Fastjson

将json字符串转换为具体对象

Person newPerson = JSON.parseObject(jsonObject, Person.class);
7.复制对象

浅拷贝,可以指定参数不拷贝

BeanUtils.copyProperties(dc,dto,"presRatio");
8.反射和springboot从配置中获取信息

在java练习中,学到了反射以及从配置文件中获取参数

 //获取配置文件中配置的参数
Properties pro=new Properties();
ClassLoader classLoader = test.class.getClassLoader();
InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");
pro.load(resourceAsStream);
String className=pro.getProperty("className");
String name=pro.getProperty("name");

//获取类
Class classs=Class.forName(className);
//新建对象
Constructor constructor = classs.getConstructor();
Object o = constructor.newInstance();

//获取方法
Method eat = classs.getDeclaredMethod(name);
//强制访问
eat.setAccessible(true);
//执行
eat.invoke(o);

获取properties文件中的参数

@Autowired
private Environment env;

env.getProperty()
9.解决反射Service层,注入失败的问题。

使用 @PostConstruct修饰的方法会在服务器加载servlet的时候运行,并且只会被服务器调用一次。被此修饰的方法会在构造函数之后,init之前运行


@Service
public class Service {
 
	@Autowired
    private Mapper mapper;
	
	//新增静态变量
	public static Service proxy;
	
	@PostConstruct
	public void init() {   
			proxy = this;
	}
	
	//更新数据库
	proxy.mapper.update();
	}
10.动态MyBatis Dynamic SQL
11.将json数组转换为对象和使用stream分页
 //将json转换成对象
        List<PatRegRecordDTO> jsonArray=JSONArray.parseArray(JSONArray.toJSONString(hisResult.getData()),PatRegRecordDTO.class);

        //使用stream分页
        List<PatRegRecordDTO> result=jsonArray.stream().skip(pageSize*(pageIndex-1)).limit(pageSize).collect(Collectors.toList());
12.时间戳

判断两个时间戳相差时间(单位:分钟)

Long s = (System.currentTimeMillis() - hqtime) / (1000 * 60);
13.map转json和json转map工具类

解决map和json互转问题

public class JsonUtil {

    @SuppressWarnings("unchecked")
    public static Map<String, Object> json2Map(String json) {
        return JSON.parseObject(json, Map.class);
    }

    public static String obj2JsonString(Object obj) {
        return JSON.toJSONString(obj);

    }

    public static void main(String[] args) {
        Map<String,Object> map=new HashMap<>();
        map.put("name","张三");
        System.out.println(obj2JsonString(map));
    }
}
14.sql注意
  • lejt join 左边过滤必须放where中,右表过滤必须放on中
  • 连接不要超过3表以上
  • 字符串长度确定,采用char类型
  • 如果varchar不满足容量,使用text,如果使用text类型需要单独建表
  • 精度要求高的使用decimal
  • 尽量使用timestamp(4字节)而非datetime(8字节)
  • 操作符<>优化 利用union all解决or索引无法命中
  • or优化 利用union解决or索引无法命中
  • in主表大子表小 exist主表小子表大
  • limit 优化 缩小扫描范围
  • like 前匹配条件尽量不用
  • 不做列运算 少用select all
15.message from server: "Host ‘XXXX’ is blocked because of many connection errors

数据库多次 错误连接 造成 屏蔽了当前ip连接数据库的请求

解决方案

选中数据库----刷新----权限(亲测可用)

img

16.查看和修改Linux的时间
  1. 查看时间和日期
    命令 : “date”
  2. 设置时间和日期
    例如:将系统日期设定成2009年11月3日的命令
    命令 : “date -s 11/03/2009”
    将系统时间设定成下午5点55分55秒的命令
    命令 : “date -s 17:55:55”
  3. 将当前时间和日期写入BIOS,避免重启后失效
    命令 : “hwclock -w”

注:
date
不加参数可以直接看到当前日期时间
cal
不加参数可以直接看到本月月历

17.请求传值为空org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing:

测试切换容器后成功

18.swagger3.0 maven配置

pom

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

配置

/**
 * Swagger2API文档的配置
 */
@Configuration
public class Swagger2Config {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.macro.mall.tiny.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("SwaggerUI演示")
                .description("mall-tiny")
                .contact(new Contact("macro", null, null))
                .version("1.0")
                .build();
    }
}

访问地址

访问地址:http://localhost:8088/swagger-ui/

参考文献:

[https://mp.weixin.qq.com/s/zxgSzME4gdvXo9FKSGaMfg]:

19.vue 格式化后自动给代码加“;”,解决方案

在项目根目录创建文件.prettierrc,然后添加代码如下

{
“semi”: false,
“singleQuote”: true
}
20.linux安装npm

1.下载nodejs

wget https://nodejs.org/dist/latest-v9.x/node-v9.11.2-linux-x86.tar.xz

2.解压

tar -xvf node-v9.11.2-linux-x86.tar.xz

3.配置软连接

格式:ln -sf 源文件 目标文件 注:-sf 覆盖

ln -sf /home/node-v9.11.2-linux-x86/bin/node /usr/local/bin

ln -sf /home/node-v9.11.2-linux-x86/bin/npm /usr/local/bin

参考文章:

https://www.jianshu.com/p/21e42cd362e7

https://blog.csdn.net/donglynn/article/details/72911061

https://www.cnblogs.com/liuqi/p/6483317.html

其他知识:

rm -rf 删除文件

tar -xvf 解压

21.grep命令使用,查看部署在linux系统上的日志

查看 区间在2020-11-19 08:00:00 到 2020-11-19 08:59:59的日志

grep -E '2020-11-19 08:[0-5][0-9]:[0-5][0-9]' nohup.out
22.aop切面编程出现错误warning no match for this type name: com.springboottest.demo [Xlint:invalidA

出错原因:

execution 表达式未学习透彻,导致运行出错

原代码:有错误的excution表达式

execution(* com.springboottest.demo.controller.*(..))

更改后:controller包及其子包下的所有方法的执行

execution(* com.springboottest.demo.controller.*.*(..))

参考文章:

execution 表达式详解:https://blog.csdn.net/qq_23167527/article/details/78623434

Spring切面编程错误:https://www.baidu.com/link?url=wsKKCFhQ5iEGfAX3wdBLAxuEQTsB9tY7azm7mnMl54c2Osti3DZ44428q0jjyc0hBfSI1Qs7DdTYrnRBQSGIN66ApMZG3voLFCm-FcNZy9y&wd=&eqid=b2e89fa600185b0b000000045fb6251e

23.过滤器、拦截器、aop

过滤器

过滤器依赖于servlet容器,属于servlet容器的规范,基于servlet容器的回调,几乎过滤所有请求,生命周期由servlet管理

代码

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<UserFilter> registrationBean(){
        FilterRegistrationBean<UserFilter> registration=new FilterRegistrationBean<UserFilter>();
        registration.setFilter(new UserFilter()); //注册自定义过滤器
        registration.addUrlPatterns("/*"); //过滤所有url请求
        registration.setName("UserFilter"); //过滤器名称
        registration.setOrder(6); //优先级,越低越优先
        return registration;
    }
}
public class UserFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
        System.out.println(httpServletRequest.getRequestURI());
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {
        System.out.println("destory");
    }
}

拦截器

拦截用户请求,并做相应处理。可以应用在权限处理、记录请求信息日志、判断用户登录等

代码

@Configuration
public class WebMVCConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        List<String> urlList=new ArrayList<>();
        urlList.add("/api/swagger-ui/");
        urlList.add("/print");
        registry.addInterceptor(new InterceptorConfig()).addPathPatterns("/user/**");
    }
}
public class InterceptorConfig implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

aop

切面,用于打印接口请求日志和返回请求数据日志

代码

@Order(1)
@Aspect
@Component
public class MyAspect {


    /**
     * 引入新的类来增强服务
     * value:指向要增强的目标对象
     * defaultImpl:引入增强功能的类
     */
    @DeclareParents(
            value = "com.springboottest.demo.service.serviceImpl.UserServiceImpl",
            defaultImpl = UserValidatorImpl.class
    )
    public UserValidator userValidator;

    @Pointcut("execution(* com.springboottest.demo.controller.*.*(..))")
    public void pointCut(){

    }

//    @Around("pointCut()")
//    public void around(ProceedingJoinPoint jp) throws Throwable {
//        System.out.println("around before............");
//        jp.proceed();
//        System.out.println("around after...................");
//    }

    @Before("pointCut() && args(user)")
    public void before(JoinPoint joinPoint, User user) {
        System.out.println(user);

        System.out.println("before1..................");
    }

    @After("pointCut()")
    public void after() {
        System.out.println("after1..................");
    }

    @AfterReturning("pointCut()")
    public void afterReturning() {
        System.out.println("afterReturning1..................");
    }

    @AfterThrowing("pointCut()")
    public void afterThrowing() {
        System.out.println("afterThrowing1......................");
    }
}

文中的代码,都是练习用的,和网上很多文章差不多,营养不多。只供复习时翻阅。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值