有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从groovy脚本获取Spring@Value

内部Java代码:

@Value("${myVar}") private String myVar;

Groovy代码内部:

import org.springframework.beans.factory.annotation.Value;
import groovy.transform.Field;
@Field @Value('${myVar}') String myVar;
return myVar;

返回null

假设未传入BeansmyVar,如何从Groovy脚本获取myVar


共 (2) 个答案

  1. # 1 楼答案

    您需要确保groovy脚本由spring管理,您可以在类上添加@Service或@Component注释。见下面的例子

    @Service
    class Demo {
    
      public @Value('${valueA}') String valueA
    
      String showValue() {
        return valueA
      }
    
    }
    
  2. # 2 楼答案

    如果我理解正确,您希望Spring上下文在Groovy脚本执行期间可用,并对脚本属性执行通常的注入

    Groovy脚本被编译成Groovy类,因此您应该能够简单地使用beanFactory.autowireBean(this)。然而,要首先获得对BeanFactory的引用,需要手动启动Spring上下文,如下所示:

    new ClassPathXmlApplicationContext('path/to/applicationContext.xml').withCloseable { context ->
    
        context.autowireCapableBeanFactory.autowireBean(this)
        ... //the rest of your script goes here
    }
    

    (您可能需要调整new ClassPathXmlApplicationContext("path/to/applicationContext.xml")根据您喜欢使用什么方法来引导您的Spring上下文,根据您的需要进行分类;此外,如果脚本是更大代码库的一部分,那么您可能希望创建一个比应用程序其余部分更小的应用程序上下文,以节省启动时间并避免常见的副作用。不过,这取决于用例)

    我唯一不确定的是@Field在将变量转换为字段时是否保留了原始注释,但如果没有任何错误,我会假设是这样

    如果没有保留注释,您可以声明一个简单的带注释的POJO bean作为可注入属性的容器,并调用def myPojo = new Pojo(); context.getBeanFactory()).autowireBean(myPojo)