1

我必须使用一个 REST api,它遵循所有可检索对象的通用语法:

baseUrl + domainObjectName + 限定符

例如“ http://myweb.com/api/ “城市”+“/{id}”

我为我的数据层创建了一个 BaseDao,我想在 DAO 实例化中设置每个域对象的基本 URL(baseUrl + domainObjectName)。问题是我在属性文件中定义了我的 api Base url(并希望保持这种方式),并且它在 DAO 构造函数中不可用。

这就是我所拥有的:

public abstract class BaseDao {

    protected static final String ID_QUALIFIER = "/{id}";
    protected String domainObjectName = "";
    protected String doBaseUrl = "";

    @Value("#{config['baseUrlRest']}")
    public String apiBaseUrl;

    public GenericDaoRestImpl(String domainObjectName) {
        this.domainObjectName = domainObjectName;
        this.doBaseUrl = apiBaseUrl + domainObjectName;
    }

}

当我的 dao 被实例化时, apiBaseUrl 仍然为空,尽管在创建之后它确实注入了 baseUrl 属性。

有没有办法解决这个问题,比如将属性作为静态常量注入?

4

1 回答 1

2

发生这种情况是因为 Java 不允许在调用构造函数之前设置类的字段。所以Spring不能注入价值。有两种解决方案:

  1. 而是将值传递给构造函数(示例 1)
  2. 使用@PostConstruct(示例 2)

示例 1:

public GenericDaoRestImpl(
    @Value("#{config['baseUrlRest']}") String apiBaseUrl
    String domainObjectName
) {
    ...
}

示例 2:

@Value("#{config['baseUrlRest']}")
public String apiBaseUrl;

public GenericDaoRestImpl(String domainObjectName) {
    this.domainObjectName = domainObjectName;
}

@PostConstruct
public void init() {
    this.domainObjectName = domainObjectName;
    this.doBaseUrl = apiBaseUrl + domainObjectName;
}

我更喜欢构造函数注入,@PostConstruct因为构造函数注入最终会导致构造函数具有许多参数,这使得它们变得笨拙。

如果您不喜欢它,您的第三个选择是使用具有流利界面的构建器模式

于 2013-10-21T08:48:03.597 回答