当前位置: 首页 > news >正文

建站公司哪个好免费网站制作作业

建站公司哪个好,免费网站制作作业,网站建设外包质量进度跟进,辽源网站优化环境 java17 springboot 3.x 如题,简单来说,jersey官方希望用户通过 register 的方式,将所有的资源类注册到jersey中,但是,一般开发中,可能定义了N个Resource类,一个一个的加入,太…
环境 java17 + springboot 3.x

如题,简单来说,jersey官方希望用户通过 register 的方式,将所有的资源类注册到jersey中,但是,一般开发中,可能定义了N个Resource类,一个一个的加入,太麻烦,也可能遗漏,解决方案就是,写个方法,扫描到resource包下的所有资源类,然后 register 到jersey中

特别注意,是 registerClasses 方法,不是 register 方法

以下两种方法

  1. 使用java自带的扫描
    1.1 核心代码
import lombok.extern.slf4j.Slf4j;
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;@Slf4j
public class ClassUtil {/*** 由于spring boot 打包为jar包,jersey packages 无法扫描jar对应的文件夹的文件,故自定义包扫描** @return class[]*/public static Set<Class<?>> findAllClasses(String... scanPackages) {Set<Class<?>> classes = new HashSet<>();for (String scanPackage : scanPackages) {ClassLoader loader = ClassUtil.class.getClassLoader();Resource[] resources = new Resource[0];try {resources = scan(loader, scanPackage);} catch (IOException e) {log.error("加载class异常", e);}classes.addAll(convert(loader, resources));}return classes;}/*** 扫描 jar 包** @param loader      ClassLoader* @param packageName packageName*/private static 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   ClassLoader* @param resource resource*/private static 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<Class>** @param loader    ClassLoader* @param resources Resource*/private static Set<Class<?>> convert(ClassLoader loader, Resource[] resources) {Set<Class<?>> classSet = new HashSet<>(resources.length);for (Resource resource : resources) {Class<?> clazz = loadClass(loader, resource);if (clazz != null) {classSet.add(clazz);}}return classSet;}}
1.2 使用
@Configuration
public class JerseyConfig extends ResourceConfig {public JerseyConfig() {// 注册包扫描 这个方法在开发使用没问题,但是打包jar后,找不到 class 文件
//        packages("com.xxx.xxx.api");// 定义扫描包含接口资源包registerClasses(ClassUtil.findAllClasses("com.xxx.xxx.api"));}
}
  1. 使用JerseyScan
    2.1 核心代码
    注意中间的 scanner.addIncludeFilter(new AnnotationTypeFilter(Path.class)); 这一行代码!!!
public class JerseyServiceAutoScanner {private JerseyServiceAutoScanner() {}public static Class[] getPublishJerseyServiceClasses(ApplicationContext context, String... scanPackages) {// 传入applicationContext对象,在整个spring容器中捞我们需要的controller// 传入的第二个参数是可变参数,字符串,用于传入需要扫描的包路径List<Class> jerseyServiceClasses = new ArrayList<>();if (scanPackages == null || scanPackages.length == 0) {return jerseyServiceClasses.toArray(new Class[jerseyServiceClasses.size()]);}ClassPathScanningCandidateComponentProvider scanner = new JerseyScanningComponentProvider(false);// 我只需要扫描使用了@Path注解的controller,如果还有其他的组合条件,可以在这里增加scanner.addIncludeFilter(new AnnotationTypeFilter(Path.class));for (var scanPackage : scanPackages) {jerseyServiceClasses.addAll(scanner.findCandidateComponents(scanPackage).stream().map(beanDefinition -> ClassUtils.resolveClassName(beanDefinition.getBeanClassName(), applicationContext.getClassLoader())).collect(Collectors.toSet()));}// 返回符合条件的spring容器中的全部的类对象return jerseyServiceClasses.toArray(new Class[jerseyServiceClasses.size()]);}private static class JerseyScanningComponentProvider extends ClassPathScanningCandidateComponentProvider {public JerseyScanningComponentProvider(boolean useDefaultFilters) {super(useDefaultFilters);}@Overrideprotected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {AnnotationMetadata metadata = beanDefinition.getMetadata();// 注意这里的值,最好debug一下,我使用的时候,只有第一个metadata.isIndependent()是truereturn (metadata.isIndependent() && metadata.isAbstract() && !beanDefinition.getMetadata().isAnnotation());}}
}
2.2 引用
@Configuration
public class JerseyConfig extends ResourceConfig implements ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}@PostConstructpublic void init() {registerClasses(JerseyServiceAutoScanner.getPublishJerseyServiceClasses(applicationContext, "com.xxx.xxx.api"));}public JerseyConfig() {// 。。。 其他的 。。。}
}

完结!!!

http://www.yayakq.cn/news/854616/

相关文章:

  • 长安网站制作无锡网站优化
  • 公司建网站多少钱合适p2p借贷网站开发
  • 网站 盈利模式一个好网站
  • 内网网站建设改版方案设计师网站设计
  • 企业网站源码程序多少钱?北海哪家公司做网站建设研发
  • 深圳松岗做网站营销策划方案模板
  • 阿里云的网站程序如何做农产品网络营销渠道
  • 专业建站公司怎么收费手机上怎么审营业执照
  • 龙岗 网站建设哪如何做视频网站流程图
  • 四川省的住房和城乡建设厅网站首页比较容易做的网站
  • 绍兴商城网站开发设计搜索引擎广告分为哪三类
  • 北京怀柔做网站管理运营的公司网站建站教程
  • 网站创建流程网站创建后台
  • 网站内部关键词品牌推广方案范文
  • iis7搭建网站织梦摄影师网站制作
  • 建设营销型网站不足之处学科基地网站建设
  • 做笑话网站赚钱吗零基础自己建网站
  • 做流量网站挂广告还能挣钱吗宁德做网站的公司
  • 网站开发与管理共多少页自媒体新手入门
  • 做图片能去哪些网站吗深圳的小型网络公司
  • 闲鱼怎么做钓鱼网站个人网站建设方案策划书
  • wordpress主题 错误网站优化描述设置
  • 遵义网站制作费用网站备案域名还是空间
  • 连云港网站开发怎么找到采购联系方式
  • dw网页设计作品简单江苏seo哪家好
  • h5 技术做健康类网站做详情页比较好的网站
  • 温州营销网站制作联系电话南昌百度推广公司
  • 专业网站是什么意思分享网络营销方式
  • 深入网站开发和运维网站上添加百度地图
  • 科技网站建设的调研sea wordpress 搭建