当前位置: 首页 > 知识库问答 >
问题:

静态字段的Spring boot自动BeanCreationException

傅峻
2023-03-14

我在自动生成属性类时遇到了一个问题。

下面是我的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

共有1个答案

元俊雅
2023-03-14

您不能使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