Настройка сообщений интернационализации Seam3

Я использую пакеты интернационализации 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 сделать это, где я могу реализовать интерфейс сообщений и каким-то образом зарегистрировать его с помощью шва, чтобы он подхватывал реализацию моих сообщений во время «внедрения», а не реализацию MessagesImpl по умолчанию, которая поставляется с интернационализацией шва. упаковка. Я немного новичок в шве / сварке, поэтому не уверен, что это просто.

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


person HenokG    schedule 26.03.2012    source источник


Ответы (1)


Выяснил один из способов сделать это после прочтения документации 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.

person HenokG    schedule 27.03.2012