Использование 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;-), но дайте ему имя, связанное с доменом.
  • Использование одноэлементного режима, который позволяет одновременный доступ для чтения, подходит для основных данных. Только я бы не помещал пароль в коде, но в таблицу базы данных, предпочтительно хэшировал и использовал синглтон в качестве поставщика для того, что читает таблицу при запуске.
  • В общем, синглтоны могут всегда создавать узкое место в приложении, потому что по определению они не масштабируются. Так что для вашего случая использования это нормально, так как мы можем предположить, что скорость доступа очень низкая. Другая проблема, которая может возникнуть, - это состояние гонки (также не в вашем случае), если у нас есть данные, которые изменяются, поскольку у нас только один экземпляр вызывается параллельно.
Другие вопросы по тегам