Я новичок в общей процедуре инъекции фасоли. Я много гуглил, но не нашел решения своей проблемы.
Запуск Wildfly 9.0.1 (финал) EJB Vers. : 3.1 CDI Vers. : 2.2.16 (SP1) JSF Vers. : 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;
}
}
2-й класс:
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» в моем дочернем классе имеет значение NULL.
При вызове моего метода сохранения из UserEmailSettings вызывается getProperties (). SetProperty () с правильными значениями, однако он никогда не сохраняется, поскольку settingsRepository имеет значение null. Я считаю, что это связано с неправильной инъекцией по какой-то причине.
Сообщите мне, если мне понадобится дополнительная информация ☺
Вот необходимая часть 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);
}
}
И, пожалуйста, покажите SettingsRepository.class
разве это не создается инъекцией? Он просто сказал, что в отладчике
Да, обычно должно быть, но иногда люди делают new
, и тогда инъекция не работает. Отсюда вопрос
Мне кажется, вы помещаете свою версию EJB с JSF ... JSF 3.1 не существует
для большей ясности: ссылающиеся объекты отображаются как Proxys - поэтому он должен быть законным / управляться циклом cdi
settingsRepository
вводится в UserModuleSettingsBean
? Есть ли у вас война с 'ejb'ами (ejb-light) или это ухо с войной и ejb-jar в ней?
см. например stackoverflow.com/questions/15132673/…
ох, а вы пробовали использовать @EJB
вместо @Inject
в SettingsRepository
?
Это ухо с войной и эйб. Инъекция с помощью @Inject работает в другом месте кода. Не могли бы вы уточнить, где мне попробовать Ejb. Репозиторий настроек вводится в UserModuleSettingsBean (см. В коде, я проверю, вводится ли он во время выполнения)
Пожалуйста, опубликуйте свою правку в качестве ответа!
хотел сказать, что моя проблема заключалась в том, что я не вызывал функцию init () в settingsService для создания свойств, поэтому getProperties было пустым