2015-08-17 2 views
3

Что касается хорошей обратной связи с пользователем, я использую сообщения на нескольких сайтах в своем веб-приложении.Каков рекомендуемый способ избежать повторного кода в ManagedBeans?

Чтобы добавить сообщение, я просто использовать:

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(type, "", message)); 

Я добавил переменные для type и message, потому что это зависит от различных проверки.

Ну, я использую разные ManagedBeans для разных сайтов, это нормально.

Мне пришло в голову, что лучше всего добавлять эти сообщения в разные ManagedBeans.

В настоящее время я всегда использую приведенный выше фрагмент кода, как более 30 раз (и он станет все более и более уверенным).

Должен ли я создать компонент с SessionScoped аннотированным или @ApplicationScoped? Есть ли у вас какие-то другие намеки, о которых я должен знать?

ответ

6

Просто спрятаться от повторного статического кода в метод многократного использования static, чтобы сделать его более DRY («Не повторяйте себя»).

Design статический метод таким образом, что вы можете в конечном итоге реорганизовать от этого,

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(type, "", message)); 

к чему-то вроде этого,

Messages.addGlobalInfo(message); 

или даже с import static com.example.Messages.*; (Eclipse: Ctrl + Смещение + M линия):

addGlobalInfo(message); 

Он не должен быть управляемым компонентом, поскольку он не содержит никакого состояния. Более того, вы должны создать конструктор по умолчанию такого класса полезности private, поэтому Java/JSF на первом месте уже не может его построить с помощью оператора new или Class#newInstance() в отражении. Если вы используете CDI, аннотируйте его, если необходимо, @Typed с пустым значением, чтобы предотвратить его регистрацию в качестве управляемого bean-кандидата через Bean<T>.

@Typed 
public final class Messages { 

    private Messages() {} 

    // ... 
} 

JSF утилита библиотека OmniFaces имеет именно этот служебный класс: org.omnifaces.util.Messages.

+0

Ну, спасибо, что указали на этот класс (wirtten самостоятельно). Я использовал 'Messages # addGlobal (Severity, String)'. Я думаю, если вы уже используете OmniFaces, он намного чище, чем другой. – alexander

+0

Добро пожаловать. Действительно, почти все повторяющиеся коды JSF в конечном итоге оказываются в OmniFaces. – BalusC

2

Может быть просто перенести этот код в какой-то служебный класс:

public void static addMessage(FacesMessage.Severity type, String message){ 
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(type, "", message)); 
} 

Также вы можете создать несколько методов с одним аргументом: addInfoMessage, addErrorMessage ...

+0

И как я должен аннотировать этот класс утилиты? – alexander

Смежные вопросы