Использование Singleton для создания учетной записи администратора по умолчанию
Я никогда не использовал новую функцию @Singleton в JavaEE 6, и я хочу попробовать.
Я думал о создании Singleton, который бы просто держал пароль, который позволит администратору приложения (человеку, который знает пароль) получить доступ к некоторому контенту приложения.
Я пытался реализовать его, следуя этому уроку, но он не работает. Вот что я сделал:
Я создал синглтон-бин:
@Singleton
@Startup
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class AdminAcountEJB implements IAdminAcountEJB {
private String password;
@PostConstruct
public void init() {
password = "password";
}
@Lock(LockType.READ)
public String getPassword() {
return password;
}
}
Я извлек интерфейс
public interface IAdminAcountEJB {
public abstract String getPassword();
}
Затем я пытаюсь внедрить синглтон в управляемый компонент, используя @EJB
@Named("managementBB")
@SessionScoped
public class ManagementBB implements Serializable{
@EJB
private IAdminAcountEJB managementEJB;
private String input;
private boolean authorized;
public String seeWhatsUp() {
if(input.equals(managementEJB.getPassword())) {
authorized = true;
return "manage?faces-redirect=true;";
}
return "index?faces-redirect=true;";
}
//Get set methods...
}
Последнее, что я делаю, это создаю некоторую разметку, которая отображается в случае ввода правильного пароля:
<h:form rendered="#{managementBB.authorized == false}">
<h:inputSecret value="#{managementEJB.input}"/>
<h:commandButton value="..." action="#{managementEJB.seeWhatsUp}"/>
</h:form>
<h:form rendered="#{managementBB.authorized}">
CORRECT PASSWORD!!
</h:form>
Мне все кажется нормальным, но когда я захожу на страницу, консоль говорит:
javax.naming.NameNotFoundException: ejbinterfaces.IAdminAcountEJB # ejbinterfaces.IAdminAcountEJB не найден
Я не понимаю, почему это не работает, вот как я внедряю другие EJB, которые не являются Singletones, но с @Singleton это не работает.
-Как я могу это исправить?
- Мне также интересно узнать, что вы думаете об использовании синглетона для этой цели, вы думаете, это хорошая и безопасная идея?
1 ответ
Я предполагаю, что проблема в том, что, поскольку вы ссылаетесь на свой синглтон в выражении EL в представлении, он должен быть аннотирован @Named
, Если вы используете ваши бобы только в других, это не обязательно.
Что касается вашего дизайна, мои 2 копейки это:
- Поскольку вы используете Java EE 6, вам не нужно указывать интерфейс для него. Тем не менее, если вы хотите / нуждаетесь в этом, не называйте это ISomething (за исключением того, что вы работаете на Apple;-), но дайте ему имя, связанное с доменом.
- Использование одноэлементного режима, который позволяет одновременный доступ для чтения, подходит для основных данных. Только я бы не помещал пароль в коде, но в таблицу базы данных, предпочтительно хэшировал и использовал синглтон в качестве поставщика для того, что читает таблицу при запуске.
- В общем, синглтоны могут всегда создавать узкое место в приложении, потому что по определению они не масштабируются. Так что для вашего случая использования это нормально, так как мы можем предположить, что скорость доступа очень низкая. Другая проблема, которая может возникнуть, - это состояние гонки (также не в вашем случае), если у нас есть данные, которые изменяются, поскольку у нас только один экземпляр вызывается параллельно.