Использование Spring из пользовательского приложения для входа в систему? - PullRequest
6 голосов
/ 17 мая 2011

Мы используем Spring для получения всех наших соединений JDBC, а также части нашей персистентной инфраструктуры.Однако для того, чтобы написать наш собственный обработчик базы данных (он должен быть настраиваемым, поскольку мы не можем использовать DBAppender по умолчанию из-за стандартов имен таблиц).Как я могу получить ссылку на пружинные бобы / использовать autowire на этом этапе из Custom Appender?Я бы предпочел оставаться в течение весны вместо использования простого JDBC.

Пользовательский Appender:

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;

public class CustomDBAppender extends AppenderBase<ILoggingEvent> {

    protected void append(ILoggingEvent event) {

    }

}

Ответы [ 3 ]

3 голосов
/ 19 октября 2011

Вот как я решил проблему - я получаю DataSource внутри метода start приложения через JNDI, а затем создаю свой JDBCTemplate.Это отлично сработало для меня - никаких проблем вообще.

public class MyAppender extends AppenderBase<ILoggingEvent>
{
  private String _jndiLocation;
  private JDBCTemplate _jt;

  public void setJndiLocation(String jndiLocation)
  {
    _jndiLocation = jndiLocation;
  }

  @Override
  public void start()
  {
    super.start();

    if (_jndiLocation == null)
    {
      throw new IllegalStateException("Must have the JNDI location");
    }
    DataSource ds;
    Context ctx;
    try
    {
      ctx = new InitialContext();
      Object obj = ctx.lookup(_jndiLocation);
      ds= (DataSource) obj;

      if (ds == null)
      {
        throw new IllegalStateException("Failed to obtain data source");
      }
      _jt = new JDBCTemplate(ds);
    }
    catch (Exception ex)
    {
      throw new IllegalStateException("Unable to obtain data source", ex);
    }

  }

  @Override
  protected void append(ILoggingEvent e)
  {
    // log to database here using my JDBCTemplate instance
  }
}

Я не знаю, столкнетесь ли вы с той же проблемой, но мне пришлось использовать многошаговую конфигурацию (как описано здесь *)1007 *), потому что я получал сообщение об ошибке «Регистратор замещений» SLF4J ( описано здесь ).

1 голос
/ 18 мая 2011

То, как я это делаю, - это использование AutowiredAnnotationBeanPostProcessor.

В конструкторе вашего аппендера вы просите AutowiredAnnotationBeanPostProcessor добавить "this".

Мои комментарии в конце этой статьи подробности техники.В статье рассказывается о похожем методе автоматического подключения объектов Hibernate.

1 голос
/ 18 мая 2011

Ваши возможности здесь ограничены, но вы можете использовать материал SingletonBeanFactoryLocator (см. Руководство Spring, Код клея и злой синглтон ) и эту запись в блоге SpringSource .

...