Java开发笔记Ⅲ (一些零碎记录)

news2024/11/20 23:30:16

一些报错处理

找不到注入的对象

可以在 dao 层 的接口上添加 @Repository 注解

common 模块报错 Unable to find main class

由于common中只有一些常量与工具类,不需要主类,故出现该错误时只需删除pom文件中的build标签即可解决

网关模块报错 Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.

原因是没有配置数据库相关信息,然而网关不需要与数据库交互,解决方法是在启动类上修改

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

关闭对数据库配置的自动装配即可

@Value注解获取不到配置值

原因:@Value注解不能给静态变量赋值

解决方法:编写Setter方法代替

    private static int port;

    private static String username;
    
    /**
     * 设置port
     *
     * @param port port
     */
    @Value("${spring.rabbitmq.port}")
    public void setPort(int port) {
        RabbitMqConnectionFactory.port = port;
    }

    /**
     * 设置username
     *
     * @param username username
     */
    @Value("${spring.rabbitmq.username}")
    public void setUsername(String username) {
        RabbitMqConnectionFactory.username = username;
    }

运行@Test方法时,不能使用Scanner类在控制台输入数据

帮助—编辑自定义虚拟机选项,追加以下配置,重启Idea即可(help — Edit Custom VM Options)

-Deditable.java.test.console=true

运维过程中发现数据输入错误

某标准字段因误输入多了个空格,导致多个表数据错误,现要用sql语句修正该字段数据,如何在数据库中找到所有错误数据并修正呢?(Oracle数据库)

SELECT
    'UPDATE ' || TABLE_NAME || ' SET ' || COLUMN_NAME || ' = ''正确数据值'' WHERE ' || COLUMN_NAME || ' = ''错误数据值'';'
FROM ALL_TAB_COLUMNS
WHERE COLUMN_NAME = '列名'	# COLUMN_NAME like '%模糊查找列名%'
    AND OWNER = '数据库名'

执行该语句后会自动生成更新语句,复制粘贴到执行面板,检查后执行即可

软删除和唯一约束冲突

数据库规范要求,业务上唯一的字段必须在数据库中建立约束,但是又想记录被删除的数据,做软删除,这就导致了删除了的数据会与未删除的数据发生冲突。

解决方案是将软删除加入唯一键列,例如,设置username和isdeleted为联合唯一,然后删除数据时将isdeleted赋值为主键,MyBatis的实现方法如下:

/**
 * 删除标记
 */
@TableLogic(value = "0", delval = "id")
@TableField(fill = FieldFill.INSERT)
protected Integer isDeleted;

hutool CollUtil 取交集,并集和差集

有个需求,实现班级学生的调整

image-20240617121543137

其实挺简单的,点击确定时候调用接口把该班级之前存储的学生删除,再把当前选中的学生存起来就行。但是因为用的是软删除,每次调整学生班级的时候,数据表里会多出好多没用的数据。

这里使用 hutoolCollUtil 进行集合操作,分开处理重复的数据与新增的数据。

CollUtil.intersection 取交集

CollUtil.subtract 取差集

CollUtil.disjunction 取交集的补集

CollUtil.union 取并集

具体实现如下

// 重复的(不需要操作的)
List<Long> repeatList = new ArrayList<>(CollUtil.intersection(新学生列表, 原学生列表));
if (!repeatList.equals(原学生列表)) {
    // 要删除的
    List<Long> deleteList = new ArrayList<>(CollUtil.subtract(原学生列表, repeatList));
    LambdaQueryWrapper<GradeStudentEntity> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(GradeStudentEntity::getGradeId, vo.getGradeId());
    if (ObjectUtil.isNotEmpty(deleteList)) {
        wrapper.in(GradeStudentEntity::getStudentId, deleteList);
    }
    remove(wrapper);
}
// 要新增的
List<Long> addList = new ArrayList<>(CollUtil.subtract(新学生列表, 原学生列表));
if (!addList.isEmpty()) {
    List<GradeStudentEntity> list = new ArrayList<>();
    for (Long studentId : addList) {
        GradeStudentEntity entity = new GradeStudentEntity();
        entity.setStudentId(studentId);
        entity.setGradeId(vo.getGradeId());
        list.add(entity);
    }
    saveBatch(list);
}

MyBatis 一对多映射

​ 主子表的关系,想要一条sql查出来

mapper.xml如下

    <resultMap type="com.power.milk.vo.MilksetVO" id="milkSetVoMap">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="price" column="price"/>
        <result property="image" column="image"/>
        <result property="description" column="description"/>
        <result property="status" column="status"/>
        <collection property="flavorItems" ofType="com.power.milk.vo.MilkFlavorVO">
            <result property="id" column="f_id"/>
            <result property="name" column="f_name"/>
            <result property="description" column="f_description"/>
            <result property="number" column="f_number"/>
        </collection>
    </resultMap>
    
    <select id="getList"  resultMap="milkSetVoMap">
        select m.* ,
        j.name AS CategoryName,
        mf.id as f_id,
        mf.name as f_name,
        mf.description as f_description,
        mf.number as f_number
        from milkset m 
        	left join milk_flavor mf on mf.milk_or_set = 2 
        		and mf.milk_or_set_id = m.id and mf.is_deleted = 0
        where m.is_deleted = 0
    </select>

然后再写下 MilksetVO 类

package com.power.milk.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.power.milk.common.utils.DateUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * 套餐
 *
 * @author Power
 * @since 2024-04-10
 */
@Data
@ApiModel(description = "套餐")
public class MilksetVO implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "主键")
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    @ApiModelProperty(value = "牛奶分类id")
    @JsonSerialize(using = ToStringSerializer.class)
    private Long categoryId;

    @ApiModelProperty(value = "套餐名称")
    private String name;

    @ApiModelProperty(value = "套餐价格")
    private BigDecimal price;

    @ApiModelProperty(value = "图片")
    private String image;

    @ApiModelProperty(value = "套餐明细Json文本")
    private String flavorItemsJson;

    @ApiModelProperty(value = "套餐明细")
    private List<FlavorInMilk> flavorItems = new ArrayList<>();

}

en…可能不太规范,但是确实实现了

img

Spring Boot 运行单元测试时使用不同配置文件

学习RabbitMQ的时候要跑官网的例子,又不想写好几个项目跑,就直接在SpringBoot的项目里加了测试类,由于每个例子的配置又不太一样,就学习了下怎么指定配置文件运行单元测试

举个例子,下边这段是 fanout 模式的代码

package com.gettler.rabbitmq.fanout;

import com.gettler.rabbitmq.RabbitmqApplication;
import com.gettler.rabbitmq.config.RabbitMqConnectionFactory;
import com.rabbitmq.client.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;

@ActiveProfiles("fanout")
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RabbitmqApplication.class, webEnvironment =
        SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ConsumerATest {
    private static final Logger logger = LoggerFactory.getLogger(ConsumerATest.class);

    @Test
    public void testConsumerA() throws Exception {
        // 创建一个connection
        Connection connection = RabbitMqConnectionFactory.getSingleInstanceConnection();
        // 创建一个channel
        Channel channel = connection.createChannel();
        // 声明交换机
        channel.exchangeDeclare("fanout", BuiltinExchangeType.FANOUT);
        // 声明临时队列
        String queueName = channel.queueDeclare().getQueue();
        // 绑定队列与交换机
        channel.queueBind(queueName, "fanout", "");
        // 消费消息
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println("获得消息:" + new String(message.getBody()));
        };
        CancelCallback cancelCallback = (consumerTag) -> {
            System.out.println("消息消费被中断");
        };
        channel.basicConsume(queueName, true, deliverCallback, cancelCallback);
    }
}

@ActiveProfiles("fanout") 就是指定读取 fanout 配置文件

image-20240619085802553

这样就可以读取到其他配置文件了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1837932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32学习笔记(九)--串口 UART/USART详解

&#xff08;1&#xff09;配置步骤1.开启RCC外设时钟 开启GPIO以及USART外设2.初始化GPIO 配置TX复用输出 RX输入3.配置USART初始化结构体4.配置串口中断 ITConfig以及NVIC&#xff08;如果需要USART中断&#xff09;5.开启USART &#xff08;2&#xff09;代码示例 案例1 串…

配对交换00

题目链接 配对交换 题目描述 注意点 num的范围在[0, 2^30 - 1]之间&#xff0c;不会发生整数溢出 解答思路 第一个思路是每次取奇数位和偶数位&#xff0c;将两位上的数字交换并根据其所处的位置求得的值与res相加&#xff0c;重复此过程即可第二个思路是将所有的奇数位和…

Python酷库之旅-比翼双飞情侣库(16)

目录 一、xlwt库的由来 1、背景和需求 2、项目启动 3、功能特点 4、版本兼容性 5、与其他库的关系 6、示例和应用 7、发展历史 二、xlwt库优缺点 1、优点 1-1、简单易用 1-2、功能丰富 1-3、兼容旧版Excel 1-4、社区支持 1-5、稳定性 2、缺点 2-1、不支持.xls…

仓库管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;公告管理&#xff0c;物资管理&#xff0c;基础数据管理&#xff0c;用户管理 用户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告管理&#xff0c;物…

华为HCIP Datacom H12-821 卷5

1.单选题 下列哪种工具不能被 route-policy 的 apply 子句直接引用? A、IP-Prefix B、tag C、community D、origin 正确答案&#xff1a; A 解析&#xff1a; 因route-policy工具中&#xff0c; apply 后面跟的是路由的相关属性。 但是ip-prefix是用来匹配路由的工具。 2…

Java基础学习-流程控制语句-顺序结构-分支结构-循环结构

目录 顺序结构&#xff1a; 分支结构&#xff1a; if语句&#xff1a; 第一种格式&#xff1a; if第二种格式&#xff1a; 案例练习 if第三种格式&#xff1a; switch语句&#xff1a; 格式&#xff1a; switch其他知识点&#xff1a; 循环结构&#xff1a; for循环…

[保姆级教程]uniapp配置vueX

文章目录 注意新建文件简单的使用 注意 uniapp是支持vueX的只需配置一下就好 新建文件 在src文件中&#xff0c;新建一个store&#xff08;如果有的话跳过&#xff09; 在store中新建一个js文件&#xff0c;修改js文件名称和选择模板为default 在 uni-app 项目根目录下&…

【C++】拷贝构造函数、拷贝赋值函数与析构函数

C中的拷贝构造函数、拷贝赋值函数与析构函数详解 一、拷贝构造函数&#xff08;Copy Constructor&#xff09;二、拷贝赋值函数&#xff08;Copy Assignment Operator&#xff09;三、析构函数&#xff08;Destructor&#xff09;四、总结 在C中&#xff0c;拷贝构造函数、拷贝…

java-SpringBoot执行定时任务-任务调度-@EnableScheduling和@Scheduled

文章目录 java借助springBoot框架&#xff0c;执行定时任务0. 项目地址1. 需求分析2、新建springBoot项目3. 编写定时任务3.1 开启调度任务3.2 编写定时任务方法 java借助springBoot框架&#xff0c;执行定时任务 0. 项目地址 https://github.com/OrangeHza/JavaDemo 1. 需求…

vue2 TypeError: compiler.plugin is not a function

俩个命令解决&#xff1a; npm i webpack-clilatest npm i webpacklatest

AI项目二十三:危险区域识别系统

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 在IPC监控视频中&#xff0c;很多IPC现在支持区域检测&#xff0c;当在区域内检测到有人闯入时&#xff0c;发送报警并联动报警系统&#xff0c;以保障生命和财产安全具有重大意义。它能够在第一时间检测到人员进入…

提升人工智能大模型的智能

前言 提升人工智能大模型的智能是一个涉及到多方面挑战和策略的复杂问题。下面是一些关键的策略和挑战&#xff0c;可以帮助我们更好地理解和处理这一问题。 策略 模型架构与深度优化&#xff1a; 深度学习架构优化&#xff1a;设计更深、更复杂的神经网络结构&#xff0c;如…

python GUI开发: tkinter菜单创建,记事本和画图软件综合项目的实战演练

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【Nginx系列】反向代理在现代网络架构中的重要性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

电动汽车厂商Rivian将全新设计元素融入由虚幻引擎驱动的车机界面

Rivian Automotive&#xff08;简称&#xff1a;“Rivian”&#xff09;&#xff0c;是美国一家电动汽车厂商&#xff0c;该品牌创办于2009年&#xff0c;总部位于加州埃尔文&#xff0c;专注于生产电动皮卡车Rivian R1T和电动SUV Rivian R1S。 Rivian的车主们正追寻这样一条道…

做动画?Animatediff 和 ComfyUI 更配哦!

如果从工作流和内存利用率的角度来说&#xff0c;Animatediff 和 ComfyUI 可能更配一些&#xff0c;毕竟制作动画是一个很吃内存的操作。 首先&#xff0c;我们需要在管理器中下载 Animatediff 插件&#xff0c;当然也可以直接导入听雨的工作流&#xff0c;然后在管理器的安装…

Chromium 开发指南2024 Mac篇-开始编译Chromium(五)

1.引言 在之前的指南中&#xff0c;我们已经详细介绍了在 macOS 上编译和开发 Chromium 的准备工作。您学会了如何安装和配置 Xcode&#xff0c;如何下载和配置 depot_tools&#xff0c;以及如何获取 Chromium 的源代码。通过这些步骤&#xff0c;您的开发环境已经搭建完毕&am…

压力应变桥信号变送光电隔离放大模块PCB焊接式 差分信号输入0-10mV/0-20mV/0-±10mV/0-±20mV转0-5V/0-10V/4-20mA

概述&#xff1a; IPO压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。该模块内部嵌入了一个高效微功率的电源&#xff0c;向输入端和输出端…

STM32CubeMX 安装教程

目录 总体讲解 1.0 java下载 1.1 CubeMx下载 2.0 java安装 2.1 CubMx安装 总体讲解 本次文章讲解CubMx的下载及安装&#xff0c;由于CubMx的运行环境需要java&#xff0c;所以我们需要先下载java的环境。 1.0 java下载 站内java8版本下载&#xff1a; https://download…

数字人源码部署该如何选对数字人源头工厂?

数字人作为AI产业的中流砥柱&#xff0c;其应用场景之广泛。从数字人口播、到直播到数字人克隆、到声音克隆、再至AI复活、数字人名片、数字人员工、数字人客服、3D息影舱智能交互、要知道这一切仅仅只是用了两年的时间&#xff0c;可见我国的AI技术取得突破性发展. 如果把时间…