Использование Singleton для создания учетной записи администратора по умолчанию - PullRequest
0 голосов
/ 27 августа 2011

Я никогда не использовал новую функцию @Singleton в JavaEE 6, и я хочу попробовать.

Я думал о том, чтобы создать синглтон с паролем, который позволит администратору приложения (человеккоторый знает пароль), чтобы получить доступ к некоторому контенту приложения.

Я пытался реализовать его, следуя этому учебнику , но он не работает.Вот что я сделал:

Я создал синглтон-компонент:

@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();
}

Затем я пытаюсь внедрить синглтон в управляемыйbean с использованием @ 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 Ответ

2 голосов
/ 28 августа 2011

Полагаю, проблема в том, что, поскольку вы ссылаетесь на свой синглтон в выражении EL в представлении, его необходимо аннотировать @Named.Если вы используете ваши компоненты только в других, это не обязательно.

Что касается вашего дизайна, мои 2 копейки следующие:

  • Поскольку вы используете Java EE 6, вы выиграли 'Для этого не нужно указывать интерфейс.Тем не менее, если вы хотите / нуждаетесь в этом, не называйте это ISomething (за исключением того, что вы работаете на Apple ;-), но присваивайте ему имя, связанное с доменом.
  • Использование единого экземпляра, который позволяет одновременный доступ для чтения, подходит для основных данных,Только я бы не помещал пароль в коде, но в таблицу базы данных, желательно хэшировать и использовать синглтон в качестве провайдера для того, что читает таблицу при запуске.узкое место в приложении, потому что по определению они не масштабируются.Так что для вашего случая использования это нормально, так как мы можем предположить, что скорость доступа очень низкая.Другая проблема, которая может возникнуть, - это состояние гонки (также не в вашем случае), если у нас есть данные, которые изменяются, поскольку у нас есть только один экземпляр, вызываемый параллельно.
...