我正在努力将 j2EE 应用程序迁移到 spring-boot..我面临很多挑战..需要您的帮助,以下是我遵循的步骤
- 是否设置了POM、JAR和WAR打包
- 尝试将 Servlet 转换为 RestController
- 我已注册的过滤器
@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,因此存在冲突,并且我的应用程序未启动,因此以如上所述的不同方式注册过滤器。
您的帮助对我来说真的是很大的进步..提前致谢..
最佳答案
我同意以上观点。我认为你把事情过于复杂化了。
我相信这就是您所需要的。 @Configuration
注解的类将在服务器启动时运行。 @Bean
注解的方法将被执行一次,并默认创建一个可用于 @Autowire
所有配置类将首先运行,然后它将扫描所有包并满足服务、组件、存储库、 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/