【瑞吉外卖】-day03

目录

前言

启动禁用员工账号

消息转换器

1. Jackson (用于JSON)

2. JAXB (用于XML)

3. Gson (用于JSON)

4. MessagePack (用于二进制格式)

 页面展示

代码部分

启动禁用员工账号修改(个人意见)

公共字段自动填充

ThreadLocal简要概述

基本用法

创建 ThreadLocal 实例:

设置值:

示例代码

注意事项


 

前言

由于昨天的员工禁用功能没有来得及实现,今天在这里重新进行实现。但是遇到了点小问题,就是前端的页面展示效果一直无法实现,状态也没有进行更新,反复观看了好多遍都没有找到问题所在。希望能够得到大佬们的指点。

启动禁用员工账号

由于格式的问题,在这里要引入一个新概念,消息转换器。

消息转换器

在Java中,消息转换器(Message Converter)通常用于将数据从一种格式转换为另一种格式。这种转换在许多场景中都非常有用,例如:

  • Web服务和REST API:在处理HTTP请求和响应时,经常需要将JSON、XML等格式的数据转换为Java对象,或将Java对象转换为这些格式的数据。
  • 消息队列:在使用消息队列(如RabbitMQ、Kafka等)时,消息通常以字节数组的形式传输,因此需要将消息内容转换为特定的格式。
  • 序列化和反序列化:在分布式系统中,不同节点之间可能需要传递复杂的对象,这时就需要进行序列化和反序列化操作。

以下是一些常见的Java消息转换器及其使用示例:

1. Jackson (用于JSON)

Jackson是一个流行的JSON处理库,可以方便地将Java对象与JSON数据相互转换。

import com.fasterxml.jackson.databind.ObjectMapper;public class JacksonExample {public static void main(String[] args) throws Exception {ObjectMapper objectMapper = new ObjectMapper();// Java对象转JSON字符串MyObject obj = new MyObject("John", 30);String jsonString = objectMapper.writeValueAsString(obj);System.out.println("JSON String: " + jsonString);// JSON字符串转Java对象MyObject objFromJson = objectMapper.readValue(jsonString, MyObject.class);System.out.println("Java Object: " + objFromJson);}
}class MyObject {private String name;private int age;// Constructors, getters and setters omitted for brevity
}

2. JAXB (用于XML)

JAXB(Java Architecture for XML Binding)是Java自带的一个框架,用于将Java对象与XML数据相互转换。

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;public class JAXBExample {public static void main(String[] args) throws JAXBException {JAXBContext context = JAXBContext.newInstance(MyObject.class);// Java对象转XML字符串MyObject obj = new MyObject("John", 30);Marshaller marshaller = context.createMarshaller();StringWriter writer = new StringWriter();marshaller.marshal(obj, writer);String xmlString = writer.toString();System.out.println("XML String: " + xmlString);// XML字符串转Java对象Unmarshaller unmarshaller = context.createUnmarshaller();MyObject objFromXml = (MyObject) unmarshaller.unmarshal(new StringReader(xmlString));System.out.println("Java Object: " + objFromXml);}
}@XmlRootElement
class MyObject {private String name;private int age;// Constructors, getters and setters omitted for brevity
}
 

3. Gson (用于JSON)

Gson是Google提供的一个用于处理JSON的库,它比Jackson更轻量级。

import com.google.gson.Gson;public class GsonExample {public static void main(String[] args) {Gson gson = new Gson();// Java对象转JSON字符串MyObject obj = new MyObject("John", 30);String jsonString = gson.toJson(obj);System.out.println("JSON String: " + jsonString);// JSON字符串转Java对象MyObject objFromJson = gson.fromJson(jsonString, MyObject.class);System.out.println("Java Object: " + objFromJson);}
}class MyObject {private String name;private int age;// Constructors, getters and setters omitted for brevity
}

4. MessagePack (用于二进制格式)

MessagePack是一种高效的二进制序列化格式,适用于需要高性能的场景。

import org.msgpack.MessagePack;
import java.io.IOException;public class MessagePackExample {public static void main(String[] args) throws IOException {MessagePack msgpack = new MessagePack();// Java对象转MessagePack字节数组MyObject obj = new MyObject("John", 30);byte[] bytes = msgpack.write(obj);System.out.println("MessagePack Bytes: " + bytes);// MessagePack字节数组转Java对象MyObject objFromBytes = msgpack.read(bytes, MyObject.class);System.out.println("Java Object: " + objFromBytes);}
}class MyObject {private String name;private int age;// Constructors, getters and setters omitted for brevity
}

 页面展示

这里出了点小问题,就是这个账号状态老是显示不成功,求解!!!

代码部分

// 启用禁用员工账号@PutMappingpublic R<String> update(HttpServletRequest request,@RequestBody Employee employee){// 获取当前登录用户的idLong empId = (Long) request.getSession().getAttribute("employee");// 设置更新时间和更新者employee.setUpdateTime(LocalDateTime.now());employee.setUpdateUser(empId);// 更新员工信息employeeService.updateById(employee);// 返回成功提示信息return R.success("员工信息修改成功");}
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.cbor.CBORFactory;
import com.von.ruiji_take_out.common.JacksonObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.cbor.MappingJackson2CborHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;
@Slf4j
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {/*** 重写扩展消息转换器的方法** @param converters Spring Boot自动配置的消息转换器列表** 此方法的目的是向Spring Boot的HTTP消息转换器列表中添加一个自定义的消息转换器* 通过这种方式,我们可以定制HTTP请求和响应的序列化和反序列化行为** @see <a href="https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#web.servlet.spring-message-converters">Spring Boot Documentation</a>*/@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {// 创建一个CBOR格式的消息转换器MappingJackson2CborHttpMessageConverter messageConverter = new MappingJackson2CborHttpMessageConverter();// 设置自定义的ObjectMapper,用于提高序列化和反序列化的灵活性和性能messageConverter.setObjectMapper(new JacksonObjectMapper());// 将自定义的消息转换器添加到列表的最前面,确保它优先被使用converters.add(0, messageConverter);}
}

启动禁用员工账号修改(个人意见)

由于没有找到问题所在,索性直接修改id的值了。简单除暴但是十分可行,只不过每次添加员工的时候都需要手动修改,这点有点麻烦。

公共字段自动填充


ThreadLocal简要概述

ThreadLocal 是 Java 中提供的一种机制,用于在多线程环境中为每个线程提供独立的变量副本。它的主要目的是解决多线程环境下的共享数据问题,避免线程间的数据干扰。

基本用法

  1. 创建 ThreadLocal 实例
    ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
  2. 设置值
    threadLocal.set(100);
  3. 获取值

    Integer value = threadLocal.get();
  4. 移除值

    threadLocal.remove();

示例代码

以下是一个简单的示例,展示了如何在多线程环境中使用 ThreadLocal

public class ThreadLocalExample {private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();public static void main(String[] args) {Runnable task = () -> {// 设置初始值threadLocal.set((int) (Math.random() * 100));try {// 模拟一些工作Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 获取并打印当前线程的值System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());};Thread thread1 = new Thread(task, "Thread-1");Thread thread2 = new Thread(task, "Thread-2");thread1.start();thread2.start();}
}

在这个示例中,两个线程分别设置了不同的随机值,并在稍后获取并打印出来。由于 ThreadLocal 确保了每个线程都有自己独立的变量副本,因此两个线程不会互相干扰。

注意事项

  1. 内存泄漏:在使用 ThreadLocal 时,如果不及时调用 remove() 方法,可能会导致内存泄漏。特别是在使用线程池的情况下,因为线程会被重用,如果不清理 ThreadLocal 变量,这些变量会一直存在,导致内存无法被回收。

  2. 初始化值:可以通过重写 initialValue() 方法来提供默认值:

    private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>() {@Overrideprotected Integer initialValue() {return 0; // 默认值}
    };
    

  3. 适用场景ThreadLocal 适用于需要在多个线程之间隔离数据的场景,例如数据库连接、用户会话等。

通过合理使用 ThreadLocal,可以有效地解决多线程编程中的共享数据问题,提高程序的安全性和可维护性。

 

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

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

相关文章

blender导入的图片渲染看不见,图片预览正常,但渲染不出

在使用Blender时&#xff0c;我们经常会遇到导入图片后在预览渲染中显示&#xff0c;但在实际渲染时图片消失的问题。本文将提供详细的解决方法&#xff0c;帮助大家解决“Blender导入的图片渲染图像不显示”的问题。 问题原因 导入的图片在Blender中只是一张图&#xff0c;并…

本质矩阵分解计算Rt

1 本质矩阵的计算 上一文章中描述了本质矩阵的计算&#xff0c;计算机视觉-对极几何-CSDN博客&#xff0c;那么计算得到本质矩阵有什么用&#xff1f;其中一个应用是通过本质矩阵计算得到2D-2D的相对变换。 在相关矩阵计算时&#xff0c;一般会在两幅图像中&#xff0c;根据特征…

【天线&通讯】电力设施检测系统源码&数据集全套:改进yolo11-RFCAConv

改进yolo11-DAttention等200全套创新点大全&#xff1a;电力设施检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者…

MQTT自动发送消息工具(自动化测试MQTT)

点击下载《MQTT客户端服务端工具》 点击下载《MQTT自动发送消息软件(自动化测试MQTT)》 1. 前言 在软件开发过程中&#xff0c;MQTT常被用作消息队列来完成特定的业务功能。当我们将相关业务代码编写完成后&#xff0c;通常需要编写额外的消息生产和消费代码来模拟消息高峰时…

智慧医疗——提出了一种基于敌对领域适应症预测候选抗癌药物的方法

导言 本方法的研究背景和要点 据估计&#xff0c;未来每两个日本人中就有一人会患上癌症&#xff0c;它是现代人最难以治愈的疾病之一。众所周知&#xff0c;癌症的发生和发展是由于人类和其他动物的细胞生长机制遭到破坏&#xff0c;细胞变成了被称为癌细胞的特殊细胞。 癌…

算法|牛客网华为机试31-40C++

牛客网华为机试 上篇&#xff1a;算法|牛客网华为机试21-30C 文章目录 HJ31 单词倒排HJ32 密码截取HJ33 整数与IP地址间的转换HJ34 图片整理HJ35 蛇形矩阵HJ36 字符串加密HJ37 统计每个月兔子的总数HJ38 求小球落地5次后所经历的路程和第5次反弹的高度HJ39 判断两个IP是否属于同…

C/C++ 随机数生成方法

1. 使用 rand() 和 srand() - 库: <stdlib.h> 或 <cstdlib> - 特点: 伪随机数生成器&#xff0c;简单易用。 - 示例: #include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); // 初始化随机数生成器 int random_nu…

AI大模型重塑软件开发:从代码自动生成到智能测试

随着AI技术的不断发展&#xff0c;AI大模型在软件开发领域的应用日益广泛。从代码自动生成到智能测试&#xff0c;AI大模型正在深刻改变着软件开发的各个环节&#xff0c;重塑着整个开发流程。本文将探讨AI大模型的定义、应用场景、优势以及挑战&#xff0c;并展望未来的发展趋…

Java的内部类

Java内部类 什么是内部类&#xff1f; 类的五大成员&#xff1a;属性、方法、构造方法、代码块、内部类在一个类的里面&#xff0c;再定义一个类 public class Outer { // 外部类class Inner { // 内部类} }public class Test { // 外部其他类public static void main(Strin…

WPF+MVVM案例实战(二十二)- 制作一个侧边弹窗栏(CD类)

文章目录 1、案例效果1、侧边栏分类2、CD类侧边弹窗实现1、样式代码实现2、功能代码实现3 运行效果4、源代码获取1、案例效果 1、侧边栏分类 A类 :左侧弹出侧边栏B类 :右侧弹出侧边栏C类 :顶部弹出侧边栏D类 :底部弹出侧边栏2、CD类侧边弹窗实现 1、样式代码实现 在原有的…

字符串算法

字符串 1.kmp匹配算法Anya and 1100 1.kmp匹配算法 模板题链接 不懂可以看这个~详细的思路 #include <string> #include <iostream>using namespace std; const int N 1000010;string s,p;// s[]是长文本&#xff0c;p[]是模式串&#xff0c;n是s的长度&#xff…

掌控板micropython编程实现OLED显示天气信息

掌控板micropython编程实现OLED显示天气信息 上一个例子已经实现了在掌控板的OLED上显示汉字&#xff0c;本例使用掌控板的wifi访问心知天气&#xff0c;获取天气信息显示在掌控板的OLED上。 访问心知天气主页&#xff08; https://www.seniverse.com/&#xff09;&#xff0…

golang通用后台管理系统03(登录校验,并生成token)

代码 package serviceimport ("fmt"//"fmt""gin/common""gin/config"sysEntity "gin/system/entity"sysUtil "gin/system/util""github.com/gin-gonic/gin""log" )func Login(c *gin.Contex…

三维测量与建模笔记 - 2.2 射影几何

教程中H矩阵写的有问题&#xff0c;上图中H矩阵应该是&#xff08;n1) x (m1) 共点不变性,下图中黄色方块标记的点&#xff0c;在射影变换前后&#xff0c;虽然直线的形状有所变化&#xff0c;但仍然相交于同一个点。 共线不变性&#xff0c;下图黄色标记的两个点&#xff0c;在…

操作系统(10) (并发(2)------基于软件/硬件/操作系统层面解决两个进程之间的临界区问题/抢占式/非抢占式内核)

目录 1. 基于软件层面(Petersons Solution) Petersons Solution 满足三个要求: 好处: 缺点 2. 基于硬件层面 1. Disabling Interrupts (禁用中断) 概念解释&#xff1a; 代码框架&#xff1a; 要求&#xff1a; 禁用中断的好处与问题&#xff1a; 2. Test and Set Lock (…

系统架构设计师-未来信息综合技术(1)

目录 一、信息物理系统CPS 1、CPS体系结构 2、CPS的技术体系 3、CPS的应用场景 二、人工智能技术 1、人工智能关键技术 2、人工智能&#xff08;AI&#xff09;芯片 一、信息物理系统CPS 定义&#xff1a;CPS通过集成先进的感知、计算、通信、控制等信息技术和自动控制技术&a…

支持向量机背后的数学奥秘

一、基本概念与原理 1.1 支持向量机的定义 支持向量机是一种二分类模型&#xff0c;其核心思想是在样本空间中寻找一个超平面&#xff0c;将不同类别的样本分开。这个超平面被称为决策边界或分隔超平面。支持向量是距离决策边界最近的点&#xff0c;这些点决定了决策边界的位…

LeetCode 热题100 之 回溯1

1.全排列 思路分析1&#xff08;回溯&#xff09;&#xff1a;要生成一个不含重复数字的数组 nums 的所有可能全排列&#xff0c;我们可以使用回溯算法。这种算法通过递归的方法探索所有可能的排列组合&#xff0c;并在合适的时机进行回溯&#xff0c;确保不会遗漏任何排列。回…

「C/C++」C/C++ 之 变量作用域详解

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

深度学习-如何计算神经网络的输出?

给定一个包含输入层、隐藏层和输出层的神经网络架构&#xff0c;可以逐层推导出各节点的输出值。具体步骤如下&#xff1a; 输入层计算&#xff1a; 输入层有 3 个节点&#xff0c;编号为 1、2、3&#xff0c;输入向量为 x_1, x_2, x_3 。输入层节点的输出值直接就是输入向量&a…