gpt4 book ai didi

java - 如何在 spring 中添加可选的依赖类?

转载 作者:行者123 更新时间:2023-11-30 07:52:33 27 4
gpt4 key购买 nike

我正在创建一个公共(public)库并想添加一个使用 ServletContext 的服务。但是由于库也应该在 cli 环境中使用,我必须找到一种方法告诉 spring 忽略那里的 servlet。

@Component
public class MyService {
//only available in a web environment
@Autowired(required = false)
private ServletContext servletContext;
}

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<optional>true</optional>
</dependency>

在实现项目中,我只想运行一个命令行界面,因此没有包含servlet依赖。

但是当我尝试启动时,在启动时会抛出以下异常:引起:java.lang.ClassNotFoundException:javax.servlet.ServletContext

问题:如何在 CommonService 中使用 ServletContext 而不必将依赖项添加到重用该类的每个项目?

最佳答案

只需包含 servlet 依赖项,并像您所做的那样将依赖项设为可选。所有其他选项都更糟糕。

这是一个相当轻量级的类——在 servlet 规范 3.1.0 上的 jar 为 93K。

但是如果你绝对必须在没有类路径上的类的情况下运行,那么你可以执行以下操作......

首先让我说,您遇到问题的原因不是因为 ServletContext 是一个字段,而是因为它是一个 Autowiring 的字段。我写了一个小测试应用程序,类的字段类型不需要在运行时可用。

因此,要使其正常工作,您需要一个配置文件和一个命名 bean。

首先,您需要按名称注入(inject) ServletContext,而不是将其键入为 ServletContext。这不是很好,因为您需要在需要使用它时将其转换为 servlet 上下文。

所以

@Autowired(required = false)
@Qualifier("servletContext")
Object servletContext

就是你要放在这里的内容。

然后创建另一个将提供 serlvet 上下文的类 - 这将通过配置文件打开 - 或者可能是 @membersound 所引用的,尽管 @ConditionalOnWebApplication 仅在 Spring Boot 中可用。

@Configuration
@Profile("web") or @ConditionalOnWebApplication
public class ServletContextProvider {

@Autowired
ServletContext servletContext;

@Bean("servletContext")
public ServletContext getServletContext() {
return servletContext;
}
}

就像我说的,只需在您的类路径中包含 ServletContext。

关于java - 如何在 spring 中添加可选的依赖类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45756873/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com