Java Can';t多模块Gradle应用程序中的autowire HttpServletRequest

Java Can';t多模块Gradle应用程序中的autowire HttpServletRequest,java,spring,spring-boot,gradle,dependency-injection,Java,Spring,Spring Boot,Gradle,Dependency Injection,我有一个由Gradle管理的多个Spring Boot微服务应用程序。有一个常见的jar和特定于域的jar,其组织方式如下: | common/ |-- common.jar | p/ |-- p-ingest.jar | g/ |-- g-ingest.jar 我的公共jar有一个类,BaseRESTService,它自动连接HttpServletRequest(我已经知道这是个坏主意,不是我的代码)。与g-ingest jar一样,p-ingest.jar导入common。geoalloc

我有一个由Gradle管理的多个Spring Boot微服务应用程序。有一个常见的jar和特定于域的jar,其组织方式如下:

| common/
|-- common.jar
| p/
|-- p-ingest.jar
| g/
|-- g-ingest.jar
我的公共jar有一个类,
BaseRESTService
,它自动连接
HttpServletRequest
(我已经知道这是个坏主意,不是我的代码)。与g-ingest jar一样,p-ingest.jar导入common。geoalloc运行没有问题。但是p-ingest,实际上是从g-ingest复制而来的,不能运行。当上下文尝试初始化时,p-ingest获取以下异常:

Field request in com.company.common.BaseRESTService required a bean of type 'javax.servlet.http.HttpServletRequest' that could not be found.
我对Spring并不陌生,我了解组件扫描和自动布线以及所有这些,但我已经为此工作了2天,我不知道发生了什么。我在两个项目上运行了
gradle dependencies
,树是相同的。以下是p-ingest的引导应用程序类:

@SpringBootApplication
@ComponentScan(
        basePackageClasses = com.company.common.ConfigurationSearchCriteriaFactory.class,
        basePackages = {"com.company.erd"})
@EnableJpaRepositories(basePackages = "com.company.erd")
@EntityScan(basePackages = {"com.company.erd"})
public class PortfolioRiskIngestApplication implements ApplicationRunner {

    private static final Log logger = LogFactory.getLog(IngestApplication.class);
    @Autowired
    private IngestService ingestService;

    public PIngestApplication(PIngestService ingestService) {this.ingestService = ingestService;}

    public static void main(String[] args) {

        SpringProfileHelper.setProfileFromAwsEnvironment();
        SpringApplication app = new SpringApplication(PIngestApplication.class);
        app.setWebEnvironment(false);
        app.run(args);
    }

    @PostConstruct
      void started() {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
      }

    @Override
    public void run(ApplicationArguments applicationArguments) {
        // define the log info
        LogInfo info = LogInfo.newInstance("run", new Object[] { StringUtility.arrayToString(applicationArguments.getSourceArgs()) });

        // log entry
        logger.info(info.entry());

        ingestService.run(applicationArguments.getSourceArgs());

        // log exit
        logger.info(info.exit());
    }
}
下面是
BaseRestService
的摘录:

public class BaseRESTService 
{
    private static final Log logger = LogFactory.getLog(BaseRESTService.class);

    @Autowired
    private HttpServletRequest request;

    @ResponseStatus(HttpStatus.NOT_FOUND)  
    @ExceptionHandler(value = EntityNotFoundException.class)  
    public ErrorResponse handleEntityNotFoundException(EntityNotFoundException e){  
        ErrorResponse errorResponse = new ErrorResponse();
        errorResponse.setErrorCode(HttpStatus.NOT_FOUND.value());
        errorResponse.setErrorMessage(e.getMessage());
        logger.error(e.getMessage(), e);
        return errorResponse;  
    } 

没什么特别的。所有涉及的类都非常简单。我欢迎任何人对我做错了什么有任何想法…

您可以使用

和调用方法:

HttpServletRequest request = requestContext.getRequest();

我解决了我的问题,这是一个新手的错误。出于懒惰,我对整个代码库进行了一次组件扫描,它提取了我们在公共jar中的控制器,该控制器只用于我们的REST应用程序。只扫描实际需要的包的组件起作用。

好吧,你有
app.setWebEnvironment(false)。因此,您的应用程序不是web应用程序。因此它不能使用HttpServletRequest,HttpServletRequest是一个通过web向servlet发出的请求,因此要求应用程序是一个web应用程序。我们所有的微服务都将其设置为false,它们可以工作。这怎么可能呢?我不知道,我可能错误地认为这是阻止使用HttpServletRequest的原因,但我不明白为什么你会告诉Spring你不在web环境中工作,而你显然是并且想要这样做的。请发布异常的完整堆栈跟踪。没有堆栈跟踪。我们有一个健康检查控制器,需要运行通过。。。我想你是对的!但至少有5名开发人员和我一起研究过这个问题,没有人发现。我被告知,将web环境设置为
true
不是我们想要的。这将使应用程序始终处于活动状态,我们需要它处于休眠状态,直到被唤醒,然后终止。正如我所说,其他应用程序都成功地做到了这一点……谢谢你的回答,但更改代码不是一个选项。我们所有的微服务都注入了
HttpServletRequest
。我需要的是一个部署解决方案。
HttpServletRequest request = requestContext.getRequest();