Java
2024-08-07 14:45:29 0 举报
AI智能生成
整理自己的Java思路,想写一点有用的东西
作者其他创作
大纲/内容
部署上线
解析域名
登录云服务,找到对应的ip,解析一个子ip<br>(必填的项一个填自己要名字前缀、一个填服务器的ip)
部署到服务器
打包前确定<br>1、数据库地址密码<br>2、redis<br>3、支付回调地址<br>4、图片地址<br>还有当前使用的application是哪个<br>当然还有端口
部署之前:备份原来的代码<br>上传新文件<br>脚本启动<br>查看日志
同步数据库<br>结构、数据同步
技术点
MongoDB
redis
密码
终端临时配置redis密码的命令:config set requirepass "123456"
rabbitMQ
websocket
定时任务
XXLjob
Spring Task<br>
搜索引擎
nacos
常用习惯
数据库常用
时间(为空也展示,连续一周)
对应的代码
表——>接口?
新增、修改<br>
列表查询(假删除记得加筛选)<br>
管理后台的、小程序的
商家的、用户的、后台管理员的
回显(要是回显的跟列表的一模一样就不用了)
管理后台、小程序
商家、用户的、管理后台的
删除
修改状态
建表
考虑哪些问题?
假删除?
加状态判断?
快捷键
格式化:Ctrl+shift+L
移除没用上的import:Ctrl+alt+O<br>
展开/合上所有方法:ctrl+shift + +/-
展开/合上当前方法:Ctrl+ +/-
常用小语句
分页
Page p = new Page<>(page,limit);<br>~Mapper.selectPage(p,qw);<br>
升序排序
Collections.sort()
获得当前登录的用户id
SysUser sysUser = iSysUserService.getById(StpUtil.getLoginIdAsLong());
JSON相关
String s = JSON.toJSONString(page6Top.getValue());//把对象转换成JSON字符串的 <br>JSONObject s = JSON.parseObject(page6Top.getValue());//把JSON字符串转换成对象的<br>JSONArray s = JSON.parseArray(page6Top.getValue());//把JSON字符串转换成数组<br>
常用工具类(判断等)
对象
对象不为空
对象为空
Integer为空
String
String相等
String不相等
以什么什么结尾
.endWith()
去除表中的空字符串:(str[0] + "").replace(" ", "");
map
List
List为空
CollectionUtils.isEmpty(list)
List不空
CollectionUtils.isNotEmpty(list)<br>
正则表达式
我的String.matches(正则表达式String)<br>
// 手机号正则表达式<br> public boolean isValidPhoneNumber(String phoneNumber) {<br> String regex = "^(13|14|15|17|18)[0-9]{9}$";<br> return phoneNumber != null && phoneNumber.matches(regex);<br> }
开发
环境<br>
maven等环境配置、搭建
常用注解
端口被占用
win
查看端口
netstat -ano | findstr 8080
杀掉端口
taskkill /f /t /im 9380
逻辑、功能
网管
拦截器
登录
Sa-Token
token(长短token、续token)<br>
验证token
String token = request.getHeader("token");<br> if (token == null) {<br> return Result.error( "token不存在");<br> }<br> Object loginIdByToken = StpUtil.getLoginIdByToken(token);<br> if (loginIdByToken == null) {<br> Result result = new Result(401, "登录失效");<br> return result;<br> }<br> String userId = loginIdByToken.toString();<br> User user = userMapper.selectById(userId);<br> if (user == null) {<br> return Result.error( "用户不存在");<br> }<br>
退出登录
常见加密<br>
接口加密
public static <T> Result<T> success(String msg,T data) {<br> Result<T> result = new Result<>();<br> result.setCode(StatusCodeEnum.STATUS200.getCode());<br> result.setMsg(msg);<br> result.setData(data);<br>//---------------------------------核心代码-------------------------------<br> if(ObjectUtil.isNotNull(data))<br> {<br> try{<br> ObjectMapper objectMapper = new ObjectMapper();<br> String jsonString = objectMapper.writeValueAsString(data);<br> AES aes = new AES("CBC", "PKCS7Padding",<br> // 密钥,可以自定义<br> key.getBytes(),<br> // iv加盐,按照实际需求添加<br> Iv.getBytes());<br> result.setData((T) aes.encryptHex(jsonString));<br> }catch (Exception e)<br> {<br> e.printStackTrace();<br> }<br> }<br>//---------------------------------核心代码-------------------------------<br> return result;<br> }<br>
多数据库元
application.properties<br>
spring.datasource.dynamic.primary=master<br>spring.datasource.dynamic.strict=false<br>spring.datasource.dynamic.datasource.master.url=jdbc:mysql://127.0.0.1:3306/jinchang-recruit?serverTimezone=GMT%2B8<br>spring.datasource.dynamic.datasource.master.username=root<br>spring.datasource.dynamic.datasource.master.password=EifjMh2G<br>spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver<br><br>spring.datasource.dynamic.datasource.slave_1.url=jdbc:mysql://127.0.0.1:3306/jinchang-job-supermarket?serverTimezone=GMT%2B8<br>spring.datasource.dynamic.datasource.slave_1.username=root<br>spring.datasource.dynamic.datasource.slave_1.password=EifjMh2G<br>spring.datasource.dynamic.datasource.slave_1.driver-class-name=com.mysql.cj.jdbc.Driver
图片上传
目标:写上传接口,把图片存到数据————>写查看图片的接口,图片能展示
上传本地
/**<br> * 上传文件<br> */<br> @ApiOperation("上传图片")<br> @PostMapping("/upload")<br> public Result<?> upload(HttpServletRequest request,<br> @RequestParam("file") MultipartFile file) throws IOException {<br> String token = request.getHeader("token");<br> if (token == null) {<br> return Result.error( StatusCodeEnum.STATUS401.getMsg());<br> }<br> String mobile = TokenUtils.nothingness(token);<br><br> String type = file.getOriginalFilename();<br> if (!type.endsWith("jpg") &&!type.endsWith("png") &&!type.endsWith("jpeg") &&!type.endsWith("gif") &&!type.endsWith("bmp") ){<br> return Result.error("文件类型错误,请上传图片!");<br> }<br><br> File filePath;<br> if (!file.isEmpty()) {<br> //上传文件路径<br> String path = "";<br> path = SystemConstant.DEFAULT_UPLOAD_URL;<br> //获得上传文件名<br> String fileName = file.getOriginalFilename();<br> assert fileName != null;<br> int lastIndexOf = fileName.lastIndexOf(".");<br> String date = getRandomString2(8);<br> //获取文件的后缀名 .jpg<br> String suffix = fileName.substring(lastIndexOf);<br> filePath = new File(path + date + suffix);<br> System.out.println(filePath);<br> //如果文件目录不存在,创建目录<br> if (!filePath.getParentFile().exists()) {<br> filePath.getParentFile().mkdirs();<br> }<br> //将上传文件保存到一个目标文件中<br> file.transferTo(filePath);<br> return Result.success( "/file/" + date + suffix);<br> } else {<br> return Result.error( "上传失败");<br> }<br> }<br>
文件相关的工具方法
@GetMapping("/test")<br> public ApiResult test(@RequestParam MultipartFile file) throws IOException {<br> // 原文件名称<br> System.out.println("file.getOriginalFilename() = " + file.getOriginalFilename());<br> // 文件的接收参数 @RequestParam MultipartFile file 中的 file<br> System.out.println("file.getName() = " + file.getName());<br> // 文件的类型<br> System.out.println("file.getContentType() = " + file.getContentType());<br> System.out.println("file.getResource() = " + file.getResource());<br> System.out.println("file.getBytes() = " + file.getBytes());<br> // 文件大小<br> System.out.println("file.getSize() = " + file.getSize());<br> return ApiResult.ok();<br> }
返回值
file.getOriginalFilename() = lbxx.jpg<br>file.getName() = file<br>file.getContentType() = image/jpeg<br>file.getResource() = MultipartFile resource [file]<br>file.getBytes() = [B@1fa8cd72<br>file.getSize() = 22820
png jpg jpeg gif bmp 之间的区别
PNG:无损压缩,支持透明,适合图标和图形。<br>JPG/JPEG:有损压缩,不支持透明,适合照片。<br>GIF:无损压缩,支持动画和简单透明,适合简单动画和图标。<br>BMP:无压缩,不支持透明,适合高质量无压缩图像。
public static final String DEFAULT_UPLOAD_URL = System.getProperty("user.dir") + File.separator + "file" + File.separator;
System.getProperty("user.dir"):获取当前用户的工作目录。<br> 例如,如果当前用户的工作目录是 /home/user,那么 System.getProperty("user.dir") 返回 /home/user。<br>
File.separator:文件分隔符,根据操作系统不同,可能是 /(Unix/Linux)或 \(Windows)。<br>
综合起来,DEFAULT_UPLOAD_URL 的值可能是:<br>在 Unix/Linux 系统上:/home/user/file/<br>在 Windows 系统上:C:\Users\user\file\<br>
assert fileName != null;
assert——>断言<br>
如果断言条件为假,程序将抛出一个 AssertionError 异常,并终止执行。<br>在这个示例中,如果 fileName 为 null,程序将抛出 AssertionError,并输出消息 "fileName cannot be null"。<br>
启用断言:<br>默认情况下,断言是禁用的。要启用断言,需要在运行程序时使用 -ea 或 -enableassertions 选项。例如:<br>java -ea MyClass
fileName.lastIndexOf(".");<br>
lastIndexOf 是 Java 字符串类(String)中的一个方法,用于查找指定字符或子字符串在字符串中最后一次出现的位置。如果找到,返回该位置的索引;如果没有找到,返回 -1。<br>
getRandomString2(8); 该方法可以根据指定的长度生成一个包含大写字母、小写字母和数字的随机字符串。<br>
public static String getRandomString2(int length) {<br> Random random = new Random();<br> StringBuilder sb = new StringBuilder();<br> for (int i = 0; i < length; i++) {<br> int number = random.nextInt(3);<br> long result = 0;<br> switch (number) {<br> case 0:<br> result = Math.round(Math.random() * 25 + 65);<br> sb.append(String.valueOf((char) result));<br> break;<br> case 1:<br> result = Math.round(Math.random() * 25 + 97);<br> sb.append(String.valueOf((char) result));<br> break;<br> case 2:<br> sb.append(String.valueOf(new Random().nextInt(10)));<br> break;<br> }<br> }<br> return sb.toString();<br> }<br>
fileName.substring(lastIndexOf);<br>
表示从 fileName 字符串中提取从 lastIndexOf 位置开始到字符串末尾的子字符串。<br>
if (!filePath.getParentFile().exists()) {<br> filePath.getParentFile().mkdirs();<br> }<br>
filePath.getParentFile().exists()<br>
filePath.getParentFile():<br>filePath 是一个 File 对象,表示一个文件或目录的路径。<br>getParentFile() 方法返回 filePath 的父目录的 File 对象。如果 filePath 没有父目录,返回 null。<br>exists():<br>exists() 方法是 File 类的一个方法,用于检查文件或目录是否存在。<br>如果文件或目录存在,返回 true;否则返回 false。
file.transferTo(filePath);
文件.transferTo(文件路径)<br>当前这个是文件是接口接到的参数的变量名<br>
return Result.success( "/file/" + date + suffix);
最终返回去掉前缀的一半的文件名
Excel
Excel模板下载
@ApiOperation(value = "下载导入模板文件")<br> @GetMapping("/downloadImportTemplateFile")<br> public void downloadImportTemplateFile(HttpServletResponse response, String fileName)throws Exception {<br> // 定义文件路径<br> String filePath = System.getProperty("user.dir") + "/template/燃气表信息收集录入需求表.xlsx";<br><br> File file = FileUtils.getFile(filePath);<br> String newfilename = URLEncoder.encode("燃气表信息收集录入需求表", "UTF-8");<br> response.setContentType("application/vnd.ms-excel");<br> response.setHeader("Content-disposition", "attachment;filename="<br> + newfilename + ".xlsx");<br> byte[] buffer = new byte[1024];<br> FileInputStream fis = null;<br> BufferedInputStream bis = null;<br> try {<br>// fis = new FileInputStream(file);<br> fis = FileUtils.openInputStream(file);<br> bis = new BufferedInputStream(fis);<br> OutputStream os = response.getOutputStream();<br> int i = bis.read(buffer);<br> while (i != -1) {<br> os.write(buffer, 0, i);<br> i = bis.read(buffer);<br> }<br> } catch (Exception e) {<br> e.printStackTrace();<br> } finally {<br> if(null!=bis) bis.close();<br> if(null!=fis) fis.close();<br> }<br> }
File file = FileUtils.getFile(filePath);
根据提供的文件路径创建一个 File 对象。这个 File 对象可以用来表示文件或目录的路径,但它本身并不创建文件或目录。<br>filePath 是一个字符串,表示文件的路径。<br>FileUtils.getFile(filePath) 是 Apache Commons IO 库中的一个方法,用于根据文件路径创建一个 File 对象。<br>
使用 URLEncoder.encode 方法将文件名编码为 UTF-8 格式,以处理文件名中的特殊字符。
设置 HTTP 响应的内容类型为 application/vnd.ms-excel,表示返回的是 Excel 文件。<br>
设置 HTTP 响应头 Content-disposition,指示浏览器将文件作为附件下载,并设置下载时的文件名为 newfilename + ".xlsx"。<br>
try 块:<br>使用 FileUtils.openInputStream 方法打开文件输入流(注释掉的行是直接使用 FileInputStream 的替代方式)。<br>使用 BufferedInputStream 包装 FileInputStream,以提高读取效率。<br>获取 HTTP 响应的输出流 OutputStream。<br>从 BufferedInputStream 中读取数据到缓冲区,并将缓冲区中的数据写入到输出流中,直到文件读取完毕。<br>catch 块:<br>捕获并打印所有异常的堆栈信息。<br>finally 块:<br>确保在读取文件完成后,关闭 BufferedInputStream 和 FileInputStream,释放资源。<br>
BufferedInputStream提升效率原理
使用 BufferedInputStream 包装 FileInputStream 是一种常见的优化技巧,可以显著提高文件读取的效率。<br>这是因为 BufferedInputStream 在内部使用了一个缓冲区,减少了直接从文件系统读取数据的次数,从而提高了读取性能。<br>
使用 bis.read(buffer) 方法从 BufferedInputStream 中读取数据到缓冲区。<br>循环读取数据,直到文件末尾(返回 -1)。<br>
在 finally 块中关闭 BufferedInputStream 和 FileInputStream,释放资源。
Excel导入
@ApiOperation(value = "导入模板文件")<br> @PostMapping("/importTemplateFile")<br> public Result importTemplateFile(HttpServletRequest request,<br> @RequestParam("file") MultipartFile mfile) throws Exception {<br> if (!StpUtil.hasPermission("admin:equipment:import")){<br> return Result.error(TotalConfig.NO_PERMISSION);<br> }<br> String token = request.getHeader("token");<br> if (token == null) {<br> return Result.error(StatusCodeEnum.STATUS401.getMsg());<br> }<br><br> String type = mfile.getOriginalFilename();<br> if (!type.endsWith("xlsx")){<br> return Result.error("文件类型错误,请上传xlsx格式!");<br> }<br><br> SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");<br> List<String[]> list = LiExcelHelperUtils.readExcelToStringArray(mfile,0);<br><br><br> List<String> accountList = new ArrayList<>();<br> List<String> gasNumberList = new ArrayList<>();<br> QueryWrapper<PersonnelInformation> queryWrapper = new QueryWrapper<>();<br> List<PersonnelInformation> personnelInformations = personnelInformationMapper.selectList(queryWrapper);<br> for (PersonnelInformation personnelInformation : personnelInformations) {<br> accountList.add(personnelInformation.getAccount());<br> gasNumberList.add(personnelInformation.getGasNumber());<br> }<br> QueryWrapper<GasDetails> queryWrapper1 = new QueryWrapper<>();<br> List<GasDetails> gas = gasDetailsMapper.selectList(queryWrapper1);<br> for (GasDetails gasDetails : gas) {<br> accountList.add(gasDetails.getAccount());<br> gasNumberList.add(gasDetails.getGasNumber());<br> }<br><br> QueryWrapper<Company> queryWrapper2 = new QueryWrapper<>();<br> List<Company> companies = companyMapper.selectList(queryWrapper2);<br> String companyName = "";<br> Integer companyId = null;<br> if (companies.size() == 1){<br> companyName = companies.get(0).getCompanyName();<br> companyId = companies.get(0).getId();<br> }<br><br> //去重<br> accountList = new ArrayList<>(new HashSet<>(accountList));<br> gasNumberList = new ArrayList<>(new HashSet<>(gasNumberList));<br><br> int validRows = 0; // 用于跟踪有效数据行的数量<br> List<PersonnelInformation> addlist = new ArrayList<>();<br> List<GasDetails> addGasDetailslist = new ArrayList<>();<br> Set<String> accountSet = new HashSet<>();<br> Set<String> gasNumberSet = new HashSet<>();<br> List<String> errorList = new ArrayList<>();<br> for (int i = 1; i < list.size(); i++) {<br> String[] str = list.get(i);<br> if (str.length < 8) {<br> return Result.error("请下载导入模板编辑后再上传!");<br> }<br> String account = (str[0] + "").replace(" ", "");<br> String user_name = (str[1] + "").replace(" ", "");<br> String user_phone = (str[2] + "").replace(" ", "");<br> String address = (str[3] + "").replace(" ", "");<br> String gas_number = (str[4] + "").replace(" ", "");<br> String install_time = (str[5] + "").replace(" ", "");<br> String gas_quantity = (str[6] + "").replace(" ", "");<br> String notes = (str[7] + "").replace(" ", "");<br><br> System.err.println("account:" + account + " user_name:" + user_name + " user_phone:" + user_phone + " address:" + address + " gas_number:" + gas_number + " install_time:" + install_time + " gas_quantity:" + gas_quantity + " notes:" + notes);<br><br> if (1==i){<br> if (!"户号".equals(account) || !"客户姓名".equals(user_name) || !"联系电话①".equals(user_phone) || !"详细地址".equals(address)<br> || !"燃气表编号②".equals(gas_number) || !"安装日期".equals(install_time) || !"表具初始读数③".equals(gas_quantity) || !"备注".equals(notes)){<br> return Result.error("请下载导入模板编辑后再上传!");<br> }<br> }else {<br> if (account.contains("备注")){<br> break;<br> }<br> //所有数据为空,则无数据,跳出当前循环<br> if (StrUtil.isBlankIfStr(account)<br> && StrUtil.isBlankIfStr(user_name)<br> && StrUtil.isBlankIfStr(user_phone)<br> && StrUtil.isBlankIfStr(address)<br> && StrUtil.isBlankIfStr(gas_number)<br> && StrUtil.isBlankIfStr(install_time)<br> && StrUtil.isBlankIfStr(gas_quantity)<br> && StrUtil.isBlankIfStr(notes)) {<br> break;<br> }<br><br> // 如果当前行不是全部为空,则视为有效数据行<br> boolean isAllEmpty = StrUtil.isBlankIfStr(account)<br> && StrUtil.isBlankIfStr(user_name)<br> && StrUtil.isBlankIfStr(user_phone)<br> && StrUtil.isBlankIfStr(address)<br> && StrUtil.isBlankIfStr(gas_number)<br> && StrUtil.isBlankIfStr(install_time)<br> && StrUtil.isBlankIfStr(gas_quantity)<br> && StrUtil.isBlankIfStr(notes);<br><br> if (!isValidPhoneNumber(user_phone)){<br> errorList.add("户号 " + account + "联系电话格式不正确,请重新填写!");<br> }<br><br> BigDecimal gas_quantity_bigdecimal = null;<br> try {<br> gas_quantity_bigdecimal = new BigDecimal(gas_quantity);<br> }catch (Exception e) {<br> e.printStackTrace();<br> errorList.add("户号 " + account + "表具初始读数格式不正确,请重新填写!");<br> }<br><br> if (gas_number.length()!=16){<br> errorList.add("户号 " + account + "燃气表编号格式不正确,请录入16位!");<br> }<br><br> LocalDateTime localDateTime = null;<br> try {<br> Date date = sdf.parse(install_time);<br> // 使用Instant类作为桥梁<br> Instant instant = date.toInstant();<br> // 转换Instant到LocalDateTime需要指定时区<br> // 这里使用系统默认时区作为示例<br> localDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();<br> } catch (Exception e) {<br> e.printStackTrace();<br> errorList.add("户号 " + account + " 日期格式不正确,请重新填写!");<br> }<br><br><br> if (accountList.contains(account)) {<br> errorList.add("户号 " + account + " 已存在!");<br> }<br> if (gasNumberList.contains(gas_number)) {<br> errorList.add("燃气表编号 " + account + " 已存在!");<br> }<br> // 校验表格中账号是否重复<br> if (!accountSet.add(account)) {<br> errorList.add("户号 " + account + " 重复!");<br> }<br> // 校验表格中燃气表编号是否重复<br> if (!gasNumberSet.add(gas_number)) {<br> errorList.add("燃气表编号 " + gas_number + " 重复!");<br> }<br><br> if (!isAllEmpty) {<br> validRows++; // 增加有效数据行的计数器<br> PersonnelInformation personnelInformation = new PersonnelInformation();<br> personnelInformation.setAccount(account);<br> personnelInformation.setUserName(user_name);<br> personnelInformation.setUserPhone(user_phone);<br> personnelInformation.setAddress(address);<br> personnelInformation.setGasNumber(gas_number);<br> personnelInformation.setInstallTime(localDateTime);<br> personnelInformation.setGasQuantity(gas_quantity_bigdecimal);<br> personnelInformation.setNotes(notes);<br> personnelInformation.setCreateTime(LocalDateTime.now());<br> personnelInformation.setStatus(1);<br><br> addlist.add(personnelInformation);<br><br> GasDetails gasDetails = new GasDetails();<br> gasDetails.setAccount(account);<br> gasDetails.setUserName(user_name);<br> gasDetails.setGasMeterBalance(gas_quantity_bigdecimal);<br> gasDetails.setGasMeterTotal(gas_quantity_bigdecimal);<br> gasDetails.setGasNumber(gas_number);<br> gasDetails.setUserAddress(address);<br> gasDetails.setCreateTime(localDateTime);<br> gasDetails.setCompanyName(companyName);<br> gasDetails.setCompanyId(companyId);<br><br> addGasDetailslist.add(gasDetails);<br><br> }else {<br> return Result.error("表格中所有列均必填,请填写完整后导入!");<br> }<br><br> }<br> }<br> //如果有错误数据,则返回错误信息<br> if (errorList.size() > 0) {<br> //去重<br> errorList = new ArrayList<>(new HashSet<>(errorList));<br> String result = String.join(";", errorList);<br> return Result.error(result);<br> }<br><br> if (validRows != addlist.size()) {<br> return Result.error("表格中有错误数据,请填写后重新上传!");<br> }<br> //批量插入数据<br> personnelInformationServiceImpl.batchInsert(addlist);<br><br> //批量插入数据<br> gasDetailsServiceImpl.batchInsert(addGasDetailslist);<br><br> return Result.success("导入成功!");<br> }
小程序的
通过微信小程序的code获取用户手机号的静态方法:
方式一:<br>public static Map<String, Object> getPhone(String code) throws Exception {<br> // 获取token<br> String token = WxQrCode.redisToken();<br> // 使用前端code获取手机号码 参数为json格式<br> String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + token;<br> Map<String, String> paramMap = new HashMap<>();<br> paramMap.put("code", code);<br> HttpHeaders headers = new HttpHeaders();<br> HttpEntity<Map<String, String>> httpEntity = new HttpEntity<>(paramMap, headers);<br> System.out.println(httpEntity);<br> ResponseEntity<Object> response = restTemplate.postForEntity(url, httpEntity, Object.class);<br> return (Map<String, Object>) response.getBody();<br> }
方式二:<br>public static String getMobile(String mobileCode) {<br> //获取access_token<br> String token = redisToken();<br> // 使用前端code获取手机号码 参数为json格式<br> String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + token;<br> Map<String, Object> paramMap = new HashMap<>();<br> paramMap.put("code", mobileCode);<br> String response = HttpUtil.post(url, JSONUtil.toJsonStr(paramMap));<br> log.info("获取用户手机号 响应:{}", response);<br> cn.hutool.json.JSONObject entries = JSONUtil.parseObj(response);<br> String phone = entries.getJSONObject("phone_info").getStr("phoneNumber");<br> return phone;<br> }<br>
常见报错
找不见mapper中的方法<br>org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.app.mapper.PublicAnnouncementMapper.noticeList<br>
改正.yaml中加:mybatis-plus.mapper-locations=classpath*:**/xml/*Mapper.xml
400 401 token登录失效<br>
不是道服务器之后找不见包文件
Impl中大小写问题
<br>Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysRoleMapper' defined in file
有不用的xxxMapper.xml注释了,但没删除,删掉就好了<br>
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported<br>
POST请求,前后端参数没对上<br>
解决方式一:@RequestBody注解去掉<br>
解决方式二:前端修改提交的参数类型(表单提交改成application/json这个)<br>
运行 'A.test' 时出错 无法解析 org.junit.vintage:junit-vintage-engine:5.8.2<br>
测试、抓包、内网穿透
swagger
Apifox/postman
postman测试图片上传<br>
<br>
postman测试Excel上传
<br>
并发性等测试工具
内网穿透
抓包小程序
接口:<br>请求路径:<br>请求参数:(参数类型:表单、JSON、路径参数、简单参数)
收藏
收藏
0 条评论
下一页