У меня есть несколько микросервисных приложений 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;
}
Ничего особенного. Все участвующие классы довольно просты. Я приветствую ЛЮБЫЕ идеи о том, что я делаю неправильно, у всех ...