【问题标题】:CDI Injected Bean from super class has null fields in child来自超类的 CDI 注入 Bean 在子类中具有空字段
【发布时间】:2018-09-12 15:13:35
【问题描述】:

我对 bean 注入的一般程序还很陌生。我用谷歌搜索了很多,但没有找到解决我的问题的方法。

附加信息

Running Wildfly 9.0.1 决赛 EJB 版本。 : 3.1 CDI 版本。 : 2.2.16 (SP1) JSF 版本。 :2.2

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.inject.Named;

@Named
@ViewScoped
public class UserEmailSettingsBean extends UserModuleSettingsBean {

private List<String> store;
private List<String> selectedStore;
//getters and setters, some fancy stuff...

@Override
public boolean saveProperties() {
    LOG.info("Save called");
    LOG.info(selectedStore.toString());
    LOG.info(store.toString());
    for(String prop : store) {
        getProperties().setProperty(prop, String.valueOf(false));
    }

    for(String selectedProp : selectedStore){
        LOG.info("selected: " + selectedProp + ":" + getProperties().getProperty(selectedProp) + " -> true");
        getProperties().setProperty(selectedProp, String.valueOf(true));
    }
    
    super.saveProperties();
    return true;
    }
}

二等:

public abstract class UserModuleSettingsBean implements ModuleSettings {
    private static final long serialVersionUID = 459417872482285085L;

    protected abstract List<String> getPropertiesName();

    @Inject
    private SettingsRepository settingsRepository;

    @Inject
    private SettingsService settingsService;

    private Properties properties = new Properties();
    @Override
    public boolean saveProperties() {
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
        settingsService.store(getProperties(), username);
        return (true);
    }
}

问题是,settingsService 是构造的,但是它的字段“settingsRepository”在我的子类中为空。

在从 UserEmailSettings 调用我的保存方法时,使用正确的值调用 getProperties().setProperty(),但它从未存储,因为 settingsRepository 为空。我认为这是由于某种原因导致错误的注入。

如果我需要提供更多信息,请告诉我☺

这是 SettingsRepository 所需的部分:

@Stateless
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class SettingsService implements Serializable {

    private static final long serialVersionUID = 1695882717866085259L;

    @Inject
    SettingsRepository settingsRepository;
    //...
}

这里是信息 SettingsRepository

@Stateless
public class SettingsRepository extends AbstractBaseRepository<Settings, Long> {

/**
 * Instantiates a new settings repository.
 */
public SettingsRepository() {
    super(Settings.class);
}
}

【问题讨论】:

  • “settingsService 是构造出来的,” 怎么样?
  • 请显示 SettingsRepository.class
  • 不是注入造成的吗?它只是说在调试器中构建
  • 是的,它通常应该,但有时人们做一个new 然后注入不起作用。因此问题
  • 我认为您将 EJB 版本与 JSF... 不存在 JSF 3.1

标签: jsf ejb cdi


【解决方案1】:

想说我的问题是我没有在 settingsService 上调用 init() 函数来创建属性,所以 getProperties 是空的

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多