Cuando se trata de inyectar una Optional<T>
, Primavera nunca llama mi frijol, y en su lugar se inyecta una Optional.empty()
.
Aquí hay un código de ejemplo:
@Configuration
public class Initialize {
@Value("optionalValue")
private String testString;
@Bean (name = "getOptionalString")
public Optional<String> getOptionalString() {
return Optional.of(this.testString); //breakpoint put here, is never called
}
}
@Component
public class Test {
public Test(@Qualifier("getOptionalString") Optional<String> optional) {
// optional's value is Optional.empty() here
}
Me di cuenta de que (por poner un punto de interrupción) de la @Bean
que nunca se llama. Si tuviera que retirar el Optional<String>
, y simplemente devolver una String
, entonces funciona!
Sé que Spring
tiene su propia dependencia opcional, pero estoy perplejo en cuanto a por qué esto no funciona (lo leí en línea dice que debería), y también no entender cómo se inicializa a Optional.empty()
?
La documentación dice:
se puede expresar la naturaleza no se requiere de una dependencia especial a través de java.util.Optional de Java 8, tal como muestra el siguiente ejemplo:
public class SimpleMovieLister { @Autowired public void setMovieFinder(Optional<MovieFinder> movieFinder) { ... } }
Así, utilizando opcional como el tipo de un grano no es una idea buena.