1、错误信息 2、问题跟踪及处理 可以看到,这个方法传递了一个Class对象和类加载器和一个字段给clearMap方法 进入clearMap方法,方法根据class对象获取属性,此时报出了属性找不到的错误 打开tomcat的源码查看这个被反射的类org.apache.catalina.loader.WebappClassLoader(tomcat源码地址) 在这个类中发现,他继承了org.apache.catalina.loader.WebappClassLoaderBase,自己本身没有定义属性 进入WebappClassLoaderBase类中,可以找到resourceEntries字段 查看WebappClassLoaderBase的注释信息发现从7.0.64往后的版本,添加了WebappClassLoaderBase用来作为类加载器 此时有两个解决方案,一是对structs版本升级,但是这样的话,对应的其他依赖版本也要升级,代价太大,第二个方法较为简单,直接更换tomcat版本使其版本号<7.0.64即可,我换了7.0.63就正常了 有更新! struct2在tomcat运行报错--java.lang.NoSuchFieldException resourceEntries 程序人生
简介 nio主要是通过WatchService、Watchkey和Path来实现文件的监控; 代码实现 public class FileMonitor { private WatchService watcher; public FileMonitor(String directory) throws IOException { watcher = FileSystems.getDefault().newWatchService(); Path path = Paths.get(directory); path.register(watcher, ENTRY_CREATE, ENTRY_MODIFY,ENTRY_DELETE); } @SuppressWarnings("InfiniteLoopStatement") public void watchFile() throws InterruptedException{ while (true) { WatchKey key = watcher.take(); for (WatchEvent<?> event : key.... 有更新! nio监控文件变化 程序人生
1、定义类注解和方法注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TypeAnnotation { String value() default "这是类注解"; } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MethodAnnotation { String value() default "这是方法注解"; } 2、处理注解 此处通过反射拿到类对象,获取注解,来操作。 再生产中也可以结合切面编程来处理注解,或者扫描指定包下的所有类,遍历处理注解 public class AnnotationHandler { public static void main(String[] args){ //可以配置扫描路径加载所有class,也可以使用aspectj直接做前面处理 Class aClass .... 有更新! 自己定义一个注解 程序人生
基本流程示意图 spring boot security默认的登录流程如下所示,弄懂登陆的流程,有助于我们后面扩展框架,解决遇到的问题 UsernamePasswordAuthenticationFilter过滤器过滤请求 调用ProviderManager认证 获取了authenticationManager处理登录,AuthenticationManager接口有多个实现类,默认调用了ProviderManager providerManager中管理了多个认证适配器,调用对应的适配器进行认证 进入DaoAuthenticationProvider进行认证 DaoAuthenticationProvider继承了AbstractUserDetailsAuthenticationProvider类,这个类又实现了AuthenticationProvider接口,这个接口中的supports方法就是上文用来匹配适配器的方法,继承这个接口,实现这个方法,就可以自定义适配器 调用InMemoryUserDetailsManager查询用户信息 DaoAuthentication.... 有更新! spring security认证流程 程序人生
临界资源需要保持他的唯一性,再代码中,可以通过单例模式来实现(这里是典型的生产者/消费者问题) 构造方法中,用synchronized来做同步处理,为了避免每次进来都要给代码加锁影响性能,先在外层套if做判断 这里的connectionMap就是一个临界资源,代码初始化创建了8个数据库链接,放在map里面,然后多线程来获取调用这些connection 为了保证临界资源的安全,对获取链接和放回链接做了一个枷锁的处理,建立一个ReentrantLock锁,然后获取两个条件,获取连接的时候,判断是否有链接,有就继续,放回链接的时候,判断链接池是否已经满了,没满就放回 package cn.com.enersun.datahub.powerevent.consumer.database; import java.sql.Connection; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.concurrent.locks.Condition; impor.... 有更新! 多线程占用临界资源 程序人生
1.下载jdk https://www.oracle.com/cn/java/technologies/javase-downloads.html 下载的时候会提示登陆,此时开启浏览器调试直接拿到下载地址,在浏览器或迅雷中新建下载,可以不用登陆下载 2.上传到服务器解压 解压命令 tar -zxvf 压缩文件 3.配置环境变量 打开文件编辑 vi /etc/profile 输入配置信息 JAVA_HOME=/home/java/jdk1.8.0_261 CLASSPATH=$JAVA_HOME/lib/ PATH=$PATH:$JAVA_HOME/bin export PATH JAVA_HOME CLASSPATH JAVA_HOME就是jdk解压的位置 4.刷新配置 source /etc/profile 有更新! linux安装Java开发环境 程序人生