博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jersey在 spring boot 添加 packages 扫描路径支持
阅读量:6692 次
发布时间:2019-06-25

本文共 4338 字,大约阅读时间需要 14 分钟。

最近公司内部系统要做数据对接,故使用 jersey 来做 restful webservice 接口设计。由于 spring boot 已经集成 jersey,估计直接导入 spring-boot-starter-jersey 就好了。

在测试时候除了遇到中文乱码之外花费了比较长的时间,其余暂时没遇到大的问题。然而发布的时候发现了一个坑。

public class JerseyConfig extends ResourceConfig {    public JerseyConfig(){        //registerClasses(findAllClasses());        packages("com.xx");        // 注册日志        register(LoggingFeature.class);        // 异常处理        register(ExceptionHandler.class);        // 跨域过滤器注册        register(CorsFilter.class);    }}

jersey 是使用 register(Class clazz) 或者 packages("packageName") 来注册或者扫描来加载所需的类到容器中的。然而在实际项目中,使用 register(Class clazz) 会写大量的注册类,依赖性太强,而且在maven多模块中更不好处理。

而使用 packages 来扫描,在开发测试的时候倒没发现什么问题,但是使用 spring boot 打成 jar 包运行时,会产生 FileNotFound 的错误,这是因为 使用 jersey 的 packages 扫描的机制是无法扫描到 jar 中的 class 文件的。

由于使用的是 spring boot,spring 的 component scan 是可以做到的。故参考 spring 扫描机制的源码,将 jar 中的 class 文件加载进来就好了。

代码如下:

import lombok.extern.slf4j.Slf4j;import org.glassfish.jersey.logging.LoggingFeature;import org.glassfish.jersey.server.ResourceConfig;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.Resource;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.core.io.support.ResourcePatternResolver;import org.springframework.core.type.classreading.CachingMetadataReaderFactory;import org.springframework.core.type.classreading.MetadataReader;import org.springframework.util.ClassUtils;import java.io.IOException;import java.util.HashSet;import java.util.Set;/** * @author gongtao * @version 2018-04-23 10:15 **/@Configuration@Slf4jpublic class JerseyConfig extends ResourceConfig {    public JerseyConfig(){        //扫描注册        registerClasses(findAllClasses());        // 注册日志        register(LoggingFeature.class);        // 异常处理        register(ExceptionHandler.class);        // 跨域过滤器注册        register(CorsFilter.class);    }    /**     * 由于spring boot 打包为jar包,jersey packages 无法扫描jar对应的文件夹的文件,故自定义包扫描     * @return     */    private Set
> findAllClasses(){ String scanPackages = "com.xxx.eoms.innerinterface.interfaces.resource.*"; ClassLoader loader = this.getClass().getClassLoader(); Resource[] resources = new Resource[0]; try { resources = scan(loader, scanPackages); } catch (IOException e) { log.error("加载class异常",e); } return convert(loader, resources); } /** * 扫描 jar 包 * @param loader * @param packageName * @return * @throws IOException */ private Resource[] scan(ClassLoader loader, String packageName) throws IOException { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(loader); String pattern = "classpath*:" + ClassUtils.convertClassNameToResourcePath(packageName) + "/**/*.class"; return resolver.getResources(pattern); } /** * 加载 class * @param loader * @param resource * @return */ private Class
loadClass(ClassLoader loader,Resource resource) { try { CachingMetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(loader); MetadataReader reader = metadataReaderFactory.getMetadataReader(resource); return ClassUtils.forName(reader.getClassMetadata().getClassName(), loader); } catch (LinkageError | ClassNotFoundException e) { if (log.isDebugEnabled()) { log.debug("Ignoring candidate class resource " + resource + " due to " + e); } return null; } catch (Throwable e) { if (log.isWarnEnabled()) { log.warn("Unexpected failure when loading class resource " + resource, e); } return null; } } /** * resources 转换为 Set
* @param loader * @param resources * @return */ private Set
> convert(ClassLoader loader,Resource[] resources){ Set
> classSet = new HashSet<>(resources.length); for (Resource resource : resources){ Class
clazz = loadClass(loader, resource); if (clazz != null){ classSet.add(clazz); } } return classSet; }

 

转载于:https://www.cnblogs.com/suiyueqiannian/p/8946720.html

你可能感兴趣的文章
Kafka 跨集群同步方案(转)
查看>>
LEA指令
查看>>
Delphi MaskEdit用法(转)
查看>>
极客Web开发资源大荟萃
查看>>
求数组的最大子数组值和最长公共子序列问题
查看>>
surfaceDestroyed什么时候被调用
查看>>
儿时不竞争,长大才胜出(转)
查看>>
Protobuf从安装到配置整理帖
查看>>
Java抓取网页数据(原网页+Javascript返回数据)
查看>>
MYSQL 的 6 个返回时间日期函数
查看>>
银行综合储蓄业务系统,水平为学了一年C语言
查看>>
java中接口的定义与实现
查看>>
不管肉鸡,还是代理,CC识别就封杀!
查看>>
HDFS Java API 常用操作
查看>>
ps 命令
查看>>
Cron表达式中特殊字符解释
查看>>
mongoDB 索引的用法
查看>>
Java序列化与反序列化(实践)
查看>>
利用js_API 运行对html文档元素的属性的CRUD操作
查看>>
Linux 架构
查看>>