我在自动生成属性类时遇到了一个问题。
下面是我的properties类,当我在@service类中自动调用它时,它的行为很好。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
@RefreshScope
public class SMSHistoryProperties {
@Autowired
Environment env;
/**
* Return the property value associated with the given key, or null if the
* key cannot be resolved.
*
* @param propName
* @return
*/
public String getProperty(String propName){
return env.getProperty(propName);
}
但是当我在我的SQLConstants类(它只有静态常量变量)中自动调用它时,我会得到一个异常。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.vzw.onem.search.properties.SMSHistoryProperties;
@Component
public class SQLConstants {
@Autowired
private static SMSHistoryProperties prop;
//~ Static fields/initializers ------------------------------------------
private static final String SMS_SCHEMA = prop.getProperty("sms.schema");
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'SQLConstants' defined in file
[...\SQLConstants.class]: Instantiation of bean failed; nested
exception is org.springframework.beans.BeanInstantiationException:
Failed to instantiate [com.search.constants.SQLConstants]: Constructor
threw exception; nested exception is java.lang.NullPointerException
我取出了静态的final引用,但仍然得到一个空指针异常。
@Autowired
private SMSHistoryProperties prop;
private String BATCH_SMS_SQL = "SELECT ACK_CODE FROM "
+ prop.getProperty("sms.schema");
NullPointer
出现在Prop.GetProperty(“sms.schema”)
上。
unsatisfiedDependencyException:创建名为“SMSController”的bean时出错:通过字段“SMS Builder”表示的不满足的依赖项;嵌套异常为org.springframework.beans.factory.unsatisfieddependencyexception:创建名为“smsbuilder”的bean时出错:通过字段“search helper”表示的不满足依赖项;嵌套异常为org.springframework.beans.factory.unsatisfieddependencyexception:创建名为“sms jdbcsearchhelper”的bean时出错:通过字段“ccc dao”表示的不满足依赖项;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建文件[..\SMSSearchDaoImpl.Class]中定义的名为“SMS SearchDaoImpl”的bean时出错:bean实例化失败;嵌套异常为org.springframework.beans.beanInstantiationException:无法实例化[com.vzw.onem.search.dao.impl.smssearchdaoImpl]:构造函数引发异常;嵌套异常是java.lang.NullPointerException
您不能使static
字段具有依赖于spring bean的初始化器,因为bean只有在spring实例化类之后才初始化,而static
字段是在实例化类之前初始化的。
相反,将这些字段设为实例字段,并使用@postconstruct
在依赖注入完成后初始化常量值。
@Component
public class SQLConstants {
@Autowired
private SMSHistoryProperties prop;
//~ Static fields/initializers ------------------------------------------
private String SMS_SCHEMA;
@PostConstruct
public void init(){
SMS_SCHEMA = prop.getProperty("sms.schema");
}
}
因此,您不能保留它们的final
字段。但您可以通过不为客户端类提供setter来保证它们不会从客户端类更新。这可能是一种可以接受的变通办法。
另一种方法是直接在字符串字段中注入值,例如:
private final String schema;
public SQLConstants(@Value("${sms.schema}")String schema){
this.schema = schema;
}
或:
@Value("${sms.schema}")
private String schema;
字段注入方式更短,但在没有Spring容器的情况下,类API的可测试性更低,而且字段也不能是final
。
@Component
@RefreshScope
public class SMSHistoryProperties {
@Autowired
Environment env;
public String getSchema(){
return env.getProperty("sms.schema");
}
public String getOtherValue(){
return env.getProperty("sms.otherValue");
}
}
操作步骤: 菜单栏: Refactor —> Move... 快捷键: Mac: fn + F6 (可能会跟系统快捷键冲突)
问题内容: 只是为了澄清我正在考虑的这个权利,在Java中,静态字段是整个类使用的变量/字段,还是可以用于引用该类的所有对象?非静态字段是由对象定义的变量吗?并且与对象1引用相同类的第二个对象可以具有与对象1的静态字段不同的值吗? 问题答案: 与实例变量不同,在创建该类的实例之前,可以访问该类中的静态字段或静态类变量。在运行时创建该类的实例时,将创建该类中的实例变量(非静态变量)。因此,直到创建该
我想澄清一下,在java中,静态字段是整个类使用的变量/字段,或者可以被引用该类的所有对象使用?非静态字段是由对象定义的变量?第二个对象引用与对象1相同的类,它可以对对象1的静态字段具有不同的值?
我有一个私有int数组,我需要以某种方式找到长度,但在静态类下无法做到这一点。我必须保持类的静态,是否可以添加其他方法来将a.length更改为其他方法? 该问题是由a.length引起的。
正如他们所说,System是最终的类,它将类型外的PrintStream作为字段成员,println是PrintStream类中的方法。 我创建了一个类,其中静态字段no的类型为,只想访问Number类的方法,但它抛出了 对于UseNumber类
我们正在开发基于spring boot 2.5.6的支付应用程序。该应用程序托管在docker上,并在Java14上启动。我们创建了一个名为的抽象类,它是,包含两个变量和。所有枚举类都扩展了这个基类,并在其中定义常量。 这个决定是为了定制整个应用程序层中使用的枚举。你可以在下面看到一个例子: 该类在实体层中用作嵌入变量,如下所示: 系统工作得很好,但是发生了一些错误,ShapeEnum的字段。RE