java - 类未在 spring-boot 中实例化(j2EE 到 spring-boot 迁移)

标签 java spring-boot

我正在努力将 j2EE 应用程序迁移到 spring-boot..我面临很多挑战..需要您的帮助,以下是我遵循的步骤

  1. 是否设置了POM、JAR和WAR打包
  2. 尝试将 Servlet 转换为 RestController
  3. 我已注册的过滤器
@Configuration

public class FilterConfigService {

    @Bean
    public FilterRegistrationBean mdcFilter() {
        FilterRegistrationBean filterRegBean = new FilterRegistrationBean();
        filterRegBean.setFilter(new MDCFilter());
        filterRegBean.addUrlPatterns("/v2/*");
        filterRegBean.setOrder(1);
        return filterRegBean;
    }

    @Bean
    public FilterRegistrationBean apiOriginFilter() {
        FilterRegistrationBean filterRegBean = new FilterRegistrationBean();
        filterRegBean.setFilter(new ApiOriginFilter());
        filterRegBean.addUrlPatterns("/v2/*");
        filterRegBean.setOrder(2);
        return filterRegBean;
    }
}
  • 有一个单例类,用于通过 servlet 的 Init() 实例化一些必要的东西,我将其删除,因为默认情况下所有 bean 在范围内都是单例,并按如下方式进行实例化(不知道这是否是好的做法)
  •     @Configuration
        public class PdfExtractServerConfig implements ApplicationListener<ContextRefreshedEvent> {
    
            @Autowired
            PdfExtractServer pdfExtractServer;
    
            private static Logger log = Logger.getLogger(PdfExtractServerConfig.class);
    
            @Override
            public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
                try {
                    pdfExtractServer.instance(); // this was called in init of servlet
                    System.out.println("instance created ..");
                }
                catch (Throwable e) {
                    log.error("Unable to start PdfExtractServer", e);
                    throw e;
                }
                //Start monitoring for system health
                ResourceCheck.startMonitoring();
                SplunkMgr.instance().addSplunkMessage("BackPressure", LogLevel.INFO);
            }
        }
    

    单吨类如下所示..

    之前是这样

        public static PdfExtractServer instance() {
                if (instance == null) {
                    synchronized (startupLock) {
                        if (instance == null) {
                            instance = new PdfExtractServer();
                            instance.start("PES");
                        }
                    }
                }
                return instance;
            }
    

    现在我把它做成了

        public static PdfExtractServer instance() {
        //      instance = new PdfExtractServer();
                instance.start("PES");
                return instance;
            }
    

    这是我的测试 Controller

        @RestController
        //@RequestMapping("/")
        public class Test {
            @RequestMapping("/test" )
            public String test(){
                return "Tested OK";
            }
        }
    

    当我尝试运行此渲染时,我不明白我在哪里做错了

    Unable to start PdfExtractServer java.lang.NullPointerException at com.it.pes.pdfextract.service.PdfExtractServer.instance(PdfExtractServer.java:78) at com.it.pes.pdfextract.config.PdfExtractServerConfig.onApplicationEvent(PdfExtractServerConfig.java:24) at com.it.pes.pdfextract.config.PdfExtractServerConfig.onApplicationEvent(PdfExtractServerConfig.java:13) at com.it.pes.pdfextract.config.PdfExtractServerConfig$$EnhancerBySpringCGLIB$$e703305a.onApplicationEvent() at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:393) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:347) at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:883) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:144) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)

    观察:我尝试通过 glassfish jersey 注册我的过滤器,但在某些 jar 内部,使用了 1.1.1 的 javax.ws.rs-api,因此存在冲突,并且我的应用程序未启动,因此以如上所述的不同方式注册过滤器。

    您的帮助对我来说真的是很大的进步..提前致谢..

    此处附有包结构。 enter image description here

    最佳答案

    我同意以上观点。我认为你把事情过于复杂化了。

    我相信这就是您所需要的。 @Configuration 注解的类将在服务器启动时运行。 @Bean 注解的方法将被执行一次,并默认创建一个可用于 @Autowire

    的单例 bean

    所有配置类将首先运行,然后它将扫描所有包并满足服务、组件、存储库、 Controller 。

    @Configuration
    public class PdfExtractServerConfig {
    
        @Bean
        public PdfExtractServer pdfExtractServer() {
           final PdfExtractServer pdfExtractServer = new PdfExtractServer();
           pdfExtractServer.start("PES");
           return pdfExtractServer
        }
    }
    

    所以当你想在任何其他spring托管bean中使用你的singelton

    // Spring will by default scan after this annotation recursively through
    // packages on classes and create by default a singleton. It will also 
    // search after all bean dependencies that need to be injected. in this case 
    // PdfExtracServer and then inject it.
    @Component 
    public class Foo {
    
        @Autowire
        private PdfExtractServer pdfExtractServer;
    
        //different methods here
    
    }
    

    关于java - 类未在 spring-boot 中实例化(j2EE 到 spring-boot 迁移),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57028576/

    相关文章:

    java.lang.AssertionError : Status expected:<200> but was:<404> in Junit test 错误

    java - 如何在 eclipse kepler 中运行 AngularJS?

    java - 如何手动触发Spring验证?

    spring-mvc - @WithMockUser 忽略用户名、密码字段?

    java - 在微服务之间共享用户 ID 的最佳实践是什么?

    java - Spring Boot 未将系统环境变量加载到 application.properties 中

    java - 如何在 web 应用程序中使用复制表单窗口,就像在 google gmail 中复制图像一样

    java - 关于 BiometricPrompt.authenticate()

    java - RejectedExecutionHandler - CallerRunsPolicy 与 AbortPolicy

    java - 是否可以从 Thymeleaf 中的 Controller 更新多个模板?