Какие компоненты используются в контексте приложения и веб-контекста весной? - PullRequest
2 голосов
/ 11 ноября 2010

Разделение между контекстом приложения и веб-контекстом (и возникающими в результате проблемами загрузчика классов) являются для меня постоянным источником проблем. Я использую Spring в своем первом проекте, переходя с плохо написанного веб-приложения на основе JSP на Spring.

Я просто хочу знать, имеет ли эта конфигурация смысл:

  • У меня есть контроллеры, объекты форм и т.п., определенные с помощью аннотаций и отсканированные в контексте веб-приложения.
  • Я переместил DAO (объекты доступа к данным) в контекст приложения после того, как они изначально были в контексте веб-приложения - это потому, что мне нужно было использовать их, чтобы получить пользователя / пароль для обеспечения безопасности Spring, который является компонентом контекста приложения. .
  • Безопасность Spring, если она определена (в соответствии с документами) в контексте приложения, что требует использования DAO.

Теперь я сталкиваюсь с проблемами загрузчика классов, когда я передаю объект в JDO / DataNucleus, и он создается загрузчиком классов веб-приложения, но все DAO являются частью контекста приложения, поэтому этот компонент получает свой собственный загрузчик классов и может ' не совпадают одинаковые объекты.

Простой метод от DAO:

@Override
public boolean userExists(String username) {
    Query query = pm.newQuery(User.class);
    query.setFilter( "username == :usernameParam" );
    query.setResult( "count(username)" );
    query.setResultClass(Long.class);
    System.out.println(username);
    Long result = (Long)query.execute(username);

    return (result!=null && result>0);
}

javax.jdo.JDOUserException: запрос вернет одно поле, но это не согласованного типа, как ResultClass (java.lang.Long): это java.lang.Long

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

Или, может быть, есть некоторые конфигурации, которые решают проблемы загрузчика классов, о которых я еще не знаю?

1 Ответ

3 голосов
/ 11 ноября 2010

Загрузчик классов не должен иметь ничего общего с контекстом Spring.Контекст веб-приложения - это пружинный контейнер, который обычно содержит контроллеры и средства разрешения представления.Контекст приложения содержит дао.Контекст веб-приложения имеет родительский контекст приложения, так что он может обращаться к компонентам dao и service, а не наоборот.Однако оба контекста являются частью одной и той же войны и должны быть загружены одним и тем же загрузчиком классов.

Глядя на ваше исключение, я думаю, это не имеет никакого отношения к Spring.

...