最近一直在研究Spring Boot。从GitHub上下载了一个my-Blog源码,一边看,一边自己尝试去实现,结果掉在坑了,研究了近一周才爬出来,特地来这博客园记录下来,一是避免自己在放这样的错误,二是希望看到的朋友能有所帮助,毕竟我在网上查了很多资料,答案基本上千篇一律,并不能解决我的问题。

先说问题:我在Controller层中引用Service层的实现类,报错,错误代码如下:

-- ::45.094 ERROR  --- [nio--exec-] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.mydemo.service.AdminUserService.login] with root cause

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.mydemo.service.AdminUserService.login
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:) ~[mybatis-3.5..jar:3.5.]
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:) ~[mybatis-3.5..jar:3.5.]
at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$(MapperProxy.java:) ~[mybatis-3.5..jar:3.5.]
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:) ~[na:1.8.0_151]
at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:) ~[mybatis-3.5..jar:3.5.]
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:) ~[mybatis-3.5..jar:3.5.]
at com.sun.proxy.$Proxy66.login(Unknown Source) ~[na:na]
at com.example.mydemo.controller.admin.AdminController.login(AdminController.java:) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_151]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:) ~[na:1.8.0_151]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:) ~[na:1.8.0_151]
at java.lang.reflect.Method.invoke(Method.java:) ~[na:1.8.0_151]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:) ~[spring-web-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:) ~[spring-web-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:) ~[spring-webmvc-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:) ~[spring-webmvc-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:) ~[spring-webmvc-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:) ~[spring-webmvc-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:) ~[spring-webmvc-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:) ~[spring-webmvc-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:) ~[spring-webmvc-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:) ~[spring-webmvc-5.1..RELEASE.jar:5.1..RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:) ~[spring-webmvc-5.1..RELEASE.jar:5.1..RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:) ~[tomcat-embed-websocket-9.0..jar:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:) ~[spring-web-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:) ~[spring-web-5.1..RELEASE.jar:5.1..RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:) ~[spring-web-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:) ~[spring-web-5.1..RELEASE.jar:5.1..RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:) ~[spring-web-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:) ~[spring-web-5.1..RELEASE.jar:5.1..RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:) ~[spring-web-5.1..RELEASE.jar:5.1..RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:) ~[spring-web-5.1..RELEASE.jar:5.1..RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:) ~[tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:) [tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:) [tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:) [tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:) [tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:) [tomcat-embed-core-9.0..jar:9.0.]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:) [tomcat-embed-core-9.0..jar:9.0.]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:) [tomcat-embed-core-9.0..jar:9.0.]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:) [tomcat-embed-core-9.0..jar:9.0.]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:) [tomcat-embed-core-9.0..jar:9.0.]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:) [tomcat-embed-core-9.0..jar:9.0.]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:) [tomcat-embed-core-9.0..jar:9.0.]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:) [na:1.8.0_151]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:) [na:1.8.0_151]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:) [tomcat-embed-core-9.0..jar:9.0.]
at java.lang.Thread.run(Thread.java:) [na:1.8.0_151]

总的来说就是绑定语句无效,并未找到  com.example.mydemo.service.AdminUserService.login此方法。我从网上百度一下,看到大多数都是再讲Mapper.xml设置错误导致,需要排查:

  1. 检查xml文件所在package名称是否和Mapper interface所在的包名一一对应;
  2. 检查xml的namespace是否和xml文件的package名称一一对应;
  3. 检查方法名称是否对应;

但我看了很多遍,我的程序都没有这些问题,并且我在Test中测试Mapper时可以用的。

@SpringBootTest
class MydemoApplicationTests {
@Autowired
AdminUserMapper adminUserMapper;
@Resource
TestService testService;
@Test
void TestInsert(){
AdminUser adminUser =new AdminUser();
adminUser.setAdminUserId(5);
adminUser.setLocked(Byte.parseByte("1"));
adminUser.setLoginPassword("123");
adminUser.setLoginUserName("zzc");
adminUser.setNickName("BigBang");
adminUserMapper.insert(adminUser);
}
@Test
void get(){
AdminUser get= adminUserMapper.login("zzc","123");
System.out.println(get);
} @Test
void TestMyService(){
testService.Test();
}
}
-- ::08.234  INFO  --- [           main] c.example.mydemo.MydemoApplicationTests  : Starting MydemoApplicationTests on LAPTOP-MFBL0MLV with PID  (started by zc in D:\Lab_Java\Demo)
-- ::08.236 INFO --- [ main] c.example.mydemo.MydemoApplicationTests : No active profile set, falling back to default profiles: default
-- ::10.117 INFO --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
-- ::10.814 INFO --- [ main] c.example.mydemo.MydemoApplicationTests : Started MydemoApplicationTests in 2.776 seconds (JVM running for 4.072)
-- ::11.102 INFO --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool- - Starting...
-- ::11.287 INFO --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool- - Start completed.
AdminUser{adminUserId=, loginUserName='zzc', loginPassword='', nickName='BigBang', locked=}
-- ::11.356 INFO --- [ Thread-] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
-- ::11.357 INFO --- [ Thread-] com.zaxxer.hikari.HikariDataSource : HikariPool- - Shutdown initiated...
-- ::11.359 INFO --- [ Thread-] com.zaxxer.hikari.HikariDataSource : HikariPool- - Shutdown completed. Process finished with exit code

可以看到get()方法是可以使用adminUserMapper的,也就是说Mapper的注入是没有问题的。此外还写了一个TestService,里面不涉及任何Mapper相关的东西,还是报这个错误。也就是说我的问题原因和Mapper并没有关系,至少不是上述这三点导致的。

问题还是出现再Service层里,我的Service层代码如下:

package com.example.mydemo.service;

import com.example.mydemo.entity.AdminUser;

public interface AdminUserService {

    AdminUser login(String userName, String password);

    /**
* 获取用户信息
*
* @param loginUserId
* @return
*/
AdminUser getUserDetailById(Integer loginUserId); /**
* 修改当前登录用户的密码
*
* @param loginUserId
* @param originalPassword
* @param newPassword
* @return
*/
Boolean updatePassword(Integer loginUserId, String originalPassword, String newPassword); /**
* 修改当前登录用户的名称信息
*
* @param loginUserId
* @param loginUserName
* @param nickName
* @return
*/
Boolean updateName(Integer loginUserId, String loginUserName, String nickName);
}
package com.example.mydemo.service.impl;

import com.example.mydemo.dao.AdminUserMapper;
import com.example.mydemo.entity.AdminUser;
import com.example.mydemo.service.AdminUserService;
import com.example.mydemo.util.MD5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service
public class AdminUserServiceImpl implements AdminUserService { @Resource
private AdminUserMapper adminUserMapper; @Override
public AdminUser login(String userName, String password) {
String passwordMd5 = MD5Util.MD5Encode(password, "UTF-8");
System.out.println("Md5:"+passwordMd5);
return adminUserMapper.login(userName, passwordMd5);
} @Override
public AdminUser getUserDetailById(Integer loginUserId) {
return adminUserMapper.selectByPrimaryKey(loginUserId);
} @Override
public Boolean updatePassword(Integer loginUserId, String originalPassword, String newPassword) {
AdminUser adminUser = adminUserMapper.selectByPrimaryKey(loginUserId);
//当前用户非空才可以进行更改
if (adminUser != null) {
String originalPasswordMd5 = MD5Util.MD5Encode(originalPassword, "UTF-8");
String newPasswordMd5 = MD5Util.MD5Encode(newPassword, "UTF-8");
//比较原密码是否正确
if (originalPasswordMd5.equals(adminUser.getLoginPassword())) {
//设置新密码并修改
adminUser.setLoginPassword(newPasswordMd5);
if (adminUserMapper.updateByPrimaryKeySelective(adminUser) > 0) {
//修改成功则返回true
return true;
}
}
}
return false;
} @Override
public Boolean updateName(Integer loginUserId, String loginUserName, String nickName) {
AdminUser adminUser = adminUserMapper.selectByPrimaryKey(loginUserId);
//当前用户非空才可以进行更改
if (adminUser != null) {
//设置新密码并修改
adminUser.setLoginUserName(loginUserName);
adminUser.setNickName(nickName);
if (adminUserMapper.updateByPrimaryKeySelective(adminUser) > 0) {
//修改成功则返回true
return true;
}
}
return false;
} }

controller层中的调用如下:

package com.example.mydemo.controller.admin;

import com.example.mydemo.entity.AdminUser;
import com.example.mydemo.service.AdminUserService;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*; import javax.annotation.Resource;
import javax.servlet.http.HttpSession; @Controller
@RequestMapping("/admin") public class AdminController {
@Resource
private AdminUserService adminUserService; @GetMapping({"/login"})
public String login() { return "admin/login";
} @PostMapping(value = "/login")
public String login(@RequestParam("userName") String userName,
@RequestParam("password") String password,
@RequestParam("verifyCode") String verifyCode,
HttpSession session){
if (StringUtils.isEmpty(verifyCode)) {
session.setAttribute("errorMsg", "验证码不能为空");
return "admin/login";
}
if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)) {
session.setAttribute("errorMsg", "用户名或密码不能为空");
return "admin/login";
}
String kaptchaCode = session.getAttribute("verifyCode") + "";
if (StringUtils.isEmpty(kaptchaCode) || !verifyCode.equals(kaptchaCode)) {
session.setAttribute("errorMsg", "验证码错误");
return "admin/login";
}
AdminUser adminUser = adminUserService.login(userName, password);
if (adminUser != null) {
session.setAttribute("loginUser", adminUser.getNickName());
session.setAttribute("loginUserId", adminUser.getAdminUserId());
//session过期时间设置为7200秒 即两小时
//session.setMaxInactiveInterval(60 * 60 * 2);
return "redirect:/admin/index";
} else {
session.setAttribute("errorMsg", "登陆失败");
return "admin/login";
} } }
package com.example.mydemo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
@MapperScan("com.example.mydemo") public class MydemoApplication { public static void main(String[] args) {
SpringApplication.run(MydemoApplication.class, args);
}
}

在网上查资料,发现有人说如果Application类包所在的位置也很关键,SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!Application类是指SpringBoot项目入口类。也就是我的Service层所在的包必须在com.example.mydemo或其子包下,否则Service层中的Bean不会被扫描到,但我的程序也满足啊。

结果就在这里思索了一周都没有一点进展,直到一天我发现我的@MapperScan扫描的路径是"com.example.mydemo"。WTF!!!

我又赶快上网查了一下@MapperScan注解

作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
       添加位置:是在Springboot启动类上面添加。

看到没,包下面所有的接口在编译后之后都会生成相应的实现类,也就是说除了我的AdminUserServiceImp外Spring Boot还注入了一个mapper实现类,当我在Controller中使用@AutoWired或@Resource获取时,获取到时这个Mapper实现类的实例,但实际上并没有真正继承AdminUserService接口,只有你在运行的时候服务器才会报错,找不到对应的方法。

于是我把Mapper扫描具体到DAO路径下,即:

package com.example.mydemo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
@MapperScan("com.example.mydemo.dao") public class MydemoApplication { public static void main(String[] args) {
SpringApplication.run(MydemoApplication.class, args);
}
}

修改后果然不再报错。

其实这个错误说起来还是挺简单,主要时自己对Spring Boot的注解,一些基本知识还是不够了解导致,看来以后还是要继续夯实基础啊。

SpringBoot中Service实现类添加@Service却任然无法注入的问题的更多相关文章

  1. Entity Framework中的实体类添加复合主键

    使用Code First模式实现给实体类添加复合主键,代码如下: using System; using System.Collections.Generic; using System.Compon ...

  2. Spring MVC中一般 普通类调用service

    在Spring MVC中,Controller中使用service只需使用注解@Resource就行,但是一般类(即不使用@Controller注解的类)要用到service时,可用如下方法: 1.S ...

  3. maven util 类 添加 service

    直接关键代码: public class DictionaryUtil { // 以下的处理,是为了在工具类中自动注入service // 前提是在applicationContext.xml中,将该 ...

  4. SpringBoot中使用AOP实现计算Service执行时间

    1.增加POM.XML的依赖架包 <!-- 引入 spring aop 依赖 --><dependency> <groupId>org.springframewor ...

  5. ssh框架中,工具类调用service层方法(参考https://www.cnblogs.com/l412382979/p/8526945.html)

    代码如下: package common.dataService; import javax.annotation.PostConstruct; import org.springframework. ...

  6. Springboot中以配置类方式自定义Mybatis的配置规则(如开启驼峰映射等)

    什么是自定义Mybatis的配置规则? 答:即原来在mybatis配置文件中中我们配置到<settings>标签中的内容,如下第6-10行内容: 1 <?xml version=&q ...

  7. springboot中oracle的依赖添加失败的解决

    由于Oracle授权问题,Maven3不提供oracle JDBC driver  步骤一:在pom中添加如下: <!--Oracle 驱动 --> <dependency> ...

  8. 在对话框中利用CToolBar类添加工具条的方法

    UINT BASED_CODE DockTool[]={ID_NEWGAME,ID_SAVE,ID_OPEN,ID_SEPARATOR,ID_COPYFEN,ID_PASTEFEN,ID_SEPARA ...

  9. SpringBoot中BeanValidation数据校验与优雅处理详解

    目录 本篇要点 后端参数校验的必要性 不使用Validator的参数处理逻辑 Validator框架提供的便利 SpringBoot自动配置ValidationAutoConfiguration Va ...

随机推荐

  1. Java实现 LeetCode 514 自由之路

    514. 自由之路 视频游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring"的金属表盘,并使用表盘拼写 ...

  2. Java实现 蓝桥杯VIP 算法训练 求指数

    问题描述 已知n和m,打印n1,n2,-,nm.要求用静态变量实现.nm表示n的m次方.已知n和m,打印n1,n2,-,nm.要求用静态变量实现.nm表示n的m次方.(每行显示5个数,每个数宽为12, ...

  3. Java实现 蓝桥杯VIP 算法提高 士兵排队问题

    算法提高 士兵排队问题 时间限制:1.0s 内存限制:256.0MB 试题 有N个士兵(1≤N≤26),编号依次为A,B,C,-,队列训练时,指挥官要把一些士兵从高到矮一次排成一行,但现在指挥官不能直 ...

  4. java实现平面点最小距离

    已知平面上若干个点的坐标. 需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数). 比如有4个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd ...

  5. 【asp.net core 系列】5 布局页和静态资源

    0. 前言 在之前的4篇的内容里,我们较为详细的介绍了路由以及控制器还有视图之间的关系.也就是说,系统如何从用户的HTTP请求解析到控制器里,然后在控制器里处理数据,并返回给视图,在视图中显示出来.这 ...

  6. 重学 Java 设计模式:实战组合模式(营销差异化人群发券,决策树引擎搭建场景)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 小朋友才做选择题,成年人我都要 头几年只要群里一问我该学哪个开发语言,哪个语言最好. ...

  7. Centos7 搭建KVM并创建Linux Windows虚拟机

    一.安装KVM   查看系统版本 cat /etc/redhat-release     关闭防火墙及selinux   systemctl disable firewalld.service 查看防 ...

  8. 详解 Flink DataStream中min(),minBy(),max(),max()之间的区别

    解释 官方文档中: The difference between min and minBy is that min returns the minimum value, whereas minBy ...

  9. ScrollView嵌套ConstraintLayout导致最后一项显示不全

    原因:scrollView不受ConstraintLayout的约束布局影响 解决方法: 保持scrollview的宽高为0dp,设置其相对ConstraintLayout相对约束 <andro ...

  10. win10系统下office 2019激活

    1.新建一个文本文件,创建批处理文件office.bat @echo off (cd /d "%~dp0")&&(NET FILE||(powershell sta ...