CONTEXTO:
Cómo proceso con informes @Scheduled
de anotación y cuando invocación Component
de Service
propiedad no siendo inicializado con la @Value
anotación aún existe físicamente .properties
y se imprimen en @PostConstruct
.
DESCRIPCIÓN:
ReportProcessor
interfaz y InventoryReportProcessor
aplicación:
@FunctionalInterface
interface ReportProcessor {
public void process(OutputStream outputStream);
}
@Component
public class InventoryReportProcessor implement ReportProcessor {
@Value("${reportGenerator.path}")
private String destinationFileToSave;
/*
@PostConstruct
public void init() {
System.out.println(destinationFileToSave);
}
*/
@Override
public Map<String, Long> process(ByteArrayOutputStream outputStream) throws IOException {
System.out.println(destinationFileToSave);
// Some data processing in here
return null;
}
}
Lo uso desde
@Service
public class ReportService {
@Value("${mws.appVersion}")
private String appVersion;
/* Other initialization and public API methods*/
@Scheduled(cron = "*/10 * * * * *")
public void processReport() {
InventoryReportProcessor reportProcessor = new InventoryReportProcessor();
Map<String, Long> skus = reportProcessor.process(new ByteArrayOutputStream());
}
}
Mi confusión proviene del hecho de que @Value
en Service
las obras bien, pero en el @Component
que vuelve null
a menos de llamadas @PostConstruct
. Además, si la llamada @PostConstruct
el valor es aún permanece null
en el resto del código de la clase.
He encontrado similares Q & A y lo hice investigación en Srping docs pero hasta ahora hay una sola idea de por qué funciona de esta manera y lo que puede ser una solución?
Es necesario que Autowire el componente para que su aplicación primavera conscientes del componente.
@Service
public class ReportService {
@Value("${mws.appVersion}")
private String appVersion;
/* Other initialization and public API methods*/
@Autowired
private ReportProcessor reportProcessor;
@Scheduled(cron = "*/10 * * * * *")
public void processReport() {
//InventoryReportProcessor reportProcessor = new InventoryReportProcessor();
Map<String, Long> skus = reportProcessor.process(new ByteArrayOutputStream());
}
}