Application.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package com.sooka;
  2. import com.sooka.jersey.provider.GsonProvider;
  3. import com.sooka.provider.AuthRequestFilter;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.glassfish.jersey.media.multipart.MultiPartFeature;
  6. import org.glassfish.jersey.server.ResourceConfig;
  7. import org.springframework.core.io.Resource;
  8. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  9. import org.springframework.core.io.support.ResourcePatternResolver;
  10. import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
  11. import org.springframework.core.type.classreading.MetadataReader;
  12. import org.springframework.stereotype.Component;
  13. import org.springframework.util.ClassUtils;
  14. import java.io.IOException;
  15. import java.util.HashSet;
  16. import java.util.Set;
  17. import java.util.logging.Level;
  18. import java.util.logging.Logger;
  19. @Component
  20. @Slf4j
  21. public class Application extends ResourceConfig {
  22. private static final Logger LOGGER = Logger.getLogger(Application.class.getName());
  23. public Application() {
  24. // 注册逻辑处理的包名
  25. registerClasses(findAllClasses());
  26. register(TestApiApplication.class);
  27. // 给Jersey注册MultiPart的支持库,用以上传文件
  28. register(MultiPartFeature.class);
  29. // 注册我们的全局请求拦截器
  30. register(AuthRequestFilter.class);
  31. // 注册Json解析器
  32. // register(JacksonJsonProvider.class);
  33. // 替换解析器为Gson
  34. register(GsonProvider.class);
  35. // 注册日志打印输出
  36. register(Logger.class);
  37. // 输出启动成功日志
  38. LOGGER.log(Level.INFO, "Application setup succeed!");
  39. }
  40. /**
  41. * 由于spring boot 打包为jar包,jersey packages 无法扫描jar对应的文件夹的文件,故自定义包扫描
  42. * @return
  43. */
  44. private Set<Class<?>> findAllClasses(){
  45. // String scanPackages = "com.sooka.api.*";
  46. String scanPackages = "com.sooka.**.*";
  47. ClassLoader loader = this.getClass().getClassLoader();
  48. Resource[] resources = new Resource[0];
  49. try {
  50. resources = scan(loader, scanPackages);
  51. } catch (IOException e) {
  52. log.error("加载class异常",e);
  53. }
  54. return convert(loader, resources);
  55. }
  56. /**
  57. * 扫描 jar 包
  58. * @param loader
  59. * @param packageName
  60. * @return
  61. * @throws IOException
  62. */
  63. private Resource[] scan(ClassLoader loader, String packageName) throws IOException {
  64. ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(loader);
  65. String pattern = "classpath*:" + ClassUtils.convertClassNameToResourcePath(packageName) + ".class";
  66. return resolver.getResources(pattern);
  67. }
  68. /**
  69. * 加载 class
  70. * @param loader
  71. * @param resource
  72. * @return
  73. */
  74. private Class<?> loadClass(ClassLoader loader,Resource resource) {
  75. try {
  76. CachingMetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(loader);
  77. MetadataReader reader = metadataReaderFactory.getMetadataReader(resource);
  78. return ClassUtils.forName(reader.getClassMetadata().getClassName(), loader);
  79. } catch (LinkageError | ClassNotFoundException e) {
  80. if (log.isDebugEnabled()) {
  81. log.debug("Ignoring candidate class resource " + resource + " due to " + e);
  82. }
  83. return null;
  84. } catch (Throwable e) {
  85. if (log.isWarnEnabled()) {
  86. log.warn("Unexpected failure when loading class resource " + resource, e);
  87. }
  88. return null;
  89. }
  90. }
  91. /**
  92. * resources 转换为 Set<Class>
  93. * @param loader
  94. * @param resources
  95. * @return
  96. */
  97. private Set<Class<?>> convert(ClassLoader loader, Resource[] resources){
  98. Set<Class<?>> classSet = new HashSet<>(resources.length);
  99. for (Resource resource : resources){
  100. Class<?> clazz = loadClass(loader, resource);
  101. if (clazz != null){
  102. classSet.add(clazz);
  103. }
  104. }
  105. return classSet;
  106. }
  107. }