Не удается автоматически подключить HttpServletRequest в многомодульном приложении Gradle - PullRequest
4 голосов
/ 11 октября 2019

У меня есть несколько микросервисных приложений Spring Boot, управляемых Gradle. Существует общий jar и jar для конкретных доменов, организованный так:

| common/
|-- common.jar
| portrisk/
|-- portrisk-ingest.jar
| geoalloc/
|-- geoalloc-ingest.jar

У моего общего jar есть класс BaseRESTService, который autowires HttpServletRequest (который я уже знаю, это плохая идея - не мойкод). Файл portrisk-ingest.jar импортирует обычный файл, как и файл geoalloc-ingest. geoalloc работает без проблем. Но portrisk, , который был буквально скопирован из geoalloc , не запускается. portrisk получает следующее исключение при попытке инициализации контекста:

Field request in com.trp.erd.common.BaseRESTService required a bean of type 'javax.servlet.http.HttpServletRequest' that could not be found.

Я не новичок в Spring, и я понимаю сканирование компонентов, автопроводку и все такое, но я уже работал над этим 2дней, и я не могу понять, что происходит. Я запустил gradle dependencies в обоих проектах, и деревья идентичны. Ниже приведен класс загрузочного приложения portrisk:

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

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

    public PortfolioRiskIngestApplication(PortfolioRiskIngestService ingestService) {this.ingestService = ingestService;}

    public static void main(String[] args) {

        SpringProfileHelper.setProfileFromAwsEnvironment();
        SpringApplication app = new SpringApplication(PortfolioRiskIngestApplication.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;  
    } 

Ничего особенного. Все участвующие классы довольно просты. Я приветствую ЛЮБЫЕ идеи о том, что я делаю неправильно, у всех ...

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Я выяснил свою проблему, и это была ошибка новичка. Из-за лени я сделал компонентное сканирование по всей нашей кодовой базе, которое подобрало контроллер, который был у нас в общем jar, который предназначался только для нашего REST-приложения. Компонент сканирования только фактических желаемых пакетов работал.

1 голос
/ 15 октября 2019

Вы можете получить HttpServletRequest используя RequestContext

@Inject
private RequestContext requestContext;

И вызвать getRequest () в методе:

HttpServletRequest request = requestContext.getRequest();
...