Настройка сообщений интернационализации Seam3 - PullRequest
1 голос
/ 27 марта 2012

Я использую пакеты интернационализации Seam 3 для реализации обмена сообщениями в моем приложении.

Короче, вот что я делаю:

Импорт / Внедрение необходимых классов:

import org.jboss.seam.international.status.Messages;
import javax.inject.Inject;
@Inject
private Messages messages;

Когда возникает ошибка, я создаю сообщение в своем бэке поддержки:

messages.error(new BundleKey("AppMsgResources", "errorMsgKey")).defaults("Error: Something bad happened!");

Наконец, я отображаю сообщение на своей странице лиц следующим образом:

<h:messages />

Я думаю, что это очень стандартно ...

Пользовательская логика, которую я хочу реализовать, состоит в том, чтобы сначала иметь возможность проверять таблицу базы данных (давайте назовем эту таблицу MessageBundleOverride) для соответствующего ключа сообщения. Если он существует, я хочу использовать значение из таблицы MessageBundleOverride, а не файл свойств. Если он не существует или является пустым, я хочу использовать значение, найденное в файле свойств.

Я думаю, что есть способ сделать это с помощью Weld / CDI, где я могу реализовать интерфейс Messages и каким-то образом зарегистрировать его в seam, чтобы он принимал мою реализацию сообщений во время «внедрения», а не реализацию по умолчанию MessagesImpl, которая приходит с пакетом интернационализации шва. Я немного новичок в Seam / Weld, поэтому не уверен, что это просто.

любая помощь очень ценится, спасибо!

1 Ответ

1 голос
/ 28 марта 2012

Придумал один из способов сделать это после прочтения документов Weld: http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#alternatives

@Alternative
@RequestScoped
public class MyMessages extends MessagesImpl {

/*
 * Override a method that you want to customize or write new code here
 */
@Override
public Set<Message> getAll() {
    Set<Message> allMessages = super.getAll();

    // do some custom logic here
    applyOverrides(allMessages);

    return allMessages;
}
...
// override any other method as needed 
// You will probably have to override everything so it probably 
// wouldnt make sense to extend the existing implementation)
...
}

В файле beans.xml вы должны будете объявить этот новый класс в качестве альтернативы стандартному:

<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

    <alternatives>
        <class>com.company.project.view.messages.MyMessages</class>
    </alternatives>
</beans>

И это должно быть сделано до тех пор, пока сварщик выбирает классы в пакете, в котором определены MyMessages.

...