spring - tasa - valor presente neto con tmar
Anotación Spring @Value en la clase @Controller que no evalúa el valor dentro del archivo de propiedades (5)
Necesita usar PropertySourcePlaceHolder si está utilizando la anotación @Value porque puede extraer el valor de un archivo de propiedades. Si está utilizando la base de configuración de Java, necesita crear un bean como este
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
O si está utilizando xml basado, declare el bean en consecuencia.
Soy nuevo en Spring y trato de inyectar una cadena con un valor usando la @Value("${loginpage.message}")
dentro de un controlador anotado con la anotación @Controller
y el valor de mi cadena se está evaluando como el cadena "${loginpage.message}"
y no lo que está dentro de mi archivo de propiedades.
Debajo está mi controlador con la cadena ''mensaje'' que quiero inyectar.
@Controller
public class LoginController extends BaseController {
@Value("${loginpage.message}")
private String message;
@RequestMapping("/")
public String goToLoginPage(Model model) {
model.addAttribute("message", message);
return "/login";
}
}
Mi contexto de aplicación se ve así:
<context:property-placeholder location="classpath:properties/application.properties" />
<context:annotation-config />
<context:component-scan base-package="com.me.application" />
Mi archivo de propiedades tiene la línea:
loginpage.message=this is a test message
Spring debe estar recuperando el valor en algún punto porque cada vez que cambio @Value("${loginpage.message}")
a un valor que no está en el archivo de propiedades como @Value("${notInPropertiesFile}")
, recibo una excepción .
Parece que la pregunta ya se ha planteado. Spring 3.0.5 no evalúa la anotación @Value de las propiedades.
La diferencia entre los contextos de la aplicación web y los contextos de aplicación servlet es una de las principales fuentes de confusión en Spring, consulte Diferencia entre applicationContext.xml y spring-servlet.xml en Spring Framework
Desde @Value
javadoc:
Tenga en cuenta que el procesamiento real de la anotación @Value es realizado por un BeanPostProcessor
De la documentación de Spring:
Las interfaces de BeanPostProcessor tienen un alcance por contenedor. Esto solo es relevante si usa jerarquías de contenedor. Si define BeanPostProcessor en un contenedor, solo hará su trabajo en los beans en ese contenedor. Los beans que están definidos en un contenedor no son procesados posteriormente por un BeanPostProcessor en otro contenedor, incluso si ambos contenedores son parte de la misma jerarquía.
Puede @Autowire Environment
y luego environment.getProperty("name")
. Ver https://.com/a/15562319/632293
Sí, tengo el mismo problema con Spring 3. Parece que no funciona dentro de Controladores. Para solucionar el problema, creé otro bean con @Service y lo inyecté en el controlador. Funcionó para mí. Espero que esto sea útil para alguien, ya que pasé todo el día para resolverlo.
Tuve un problema similar en mi proyecto de primavera, pero específicamente en la primavera BATCH uno. Construí inicialmente mi configuración de la siguiente manera
@Configuration
public class BatchConfig
{
@Bean
public Job job(@Autowired Step stepMulti, @Autowired Step stepMultiDiff, @Autowired Step stepMultiPolling
){
Job job = jobBuilders.get("job")
.start(init0())
.on("POLLING").to(stepMultiPolling)
.from(init0()).on("*").to(stepMulti).next(stepMultiDiff).end()
.build();
return job;
}
@Bean
public Step init0(){
return stepBuilders.get("init0")
.tasklet(new MyDecider())
.build();
}
...
}
con MyDecider en breve como a continuación
public class MyDecider implements StepExecutionListener , Tasklet{
@Autowired ThreadPoolTaskScheduler taskScheduler;
@Value("${read.chunk.size}") private Integer pagesize;
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
return RepeatStatus.FINISHED;
}
@Override
public ExitStatus afterStep(StepExecution exe) {
String type = exe.getJobParameters().getString("mode");
log.info("SPRING BATCH props:");
log.info(" READ chunk size: {}", pagesize);
if (StringUtils.equals(type, "send")) {
log.info("MODE batch SENDING...");
if (taskScheduler !=null) taskScheduler.shutdown();
else log.info(" Not able to stop scheduler (is null)");
return new ExitStatus("SEND");
} else {
log.info("MODE batch POLLING...");
return new ExitStatus("POLLING");
}
}
Pero de esta forma, ni taskScheduler se conectó ni se insertó el tamaño de página; ambos nulos. Gracias a la respuesta de Boris, después de intentarlo, cambié BatchConfig como a continuación, funcionando perfectamente
...
@Bean
public Step init0(){
return stepBuilders.get("init0")
.tasklet(decider())
.build();
}
@Bean
public Tasklet decider() {
return new MyDecider();
}
...
Motivo: tener la construcción de MyDecider más cerca de una anotación de Bean en BatchConfig (la de decider () ), hacer que Spring entienda que MyDecider debe ser inyectado correctamente, con valores encontrados en los valores de application.property y cableado con TaskScheduler usado (porque lo intenté) también para tener la activación de SpringScheduler, pero quería quitarla si la opción de inicio del jar era ''enviar'').
NOTA: con el modo de opción = "enviar", el trabajo por lotes de primavera avanza hacia stepMulti y no stepMultiPolling, porque el estado de salida de MyDecider fue SEND y no POLLING; pero eso es solo una explicación de este tema, así que omito más detalles.
Espero que este caso de lote de primavera puede ser útil para alguien!