2010-11-11 3 views
2

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

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

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

Теперь я бегу в проблемы ClassLoader, где я передать объект 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

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

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

+0

Ваша терминология сбивает с толку. «контекст приложения» и «веб-контекст» могут ссылаться на разные вещи, но вы используете их, как будто они означают нечто конкретное. – skaffman

+0

Спасибо, скаффман, я поясню, что имею в виду контекст приложения Spring (который в терминах spring-mvc представляет собой контекст cross-webapp, под которым создаются бобы, доступные во всех веб-папках) и WebApp Context, который является контекстом в который создает все бобы, специфичные для одного webapp. Я хочу использовать термины в терминологии Spring. –

ответ

3

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

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

+0

Существует еще один подобный вопрос на http://stackoverflow.com/questions/4013047/different-classloaders-cause-classcastexception-when-persisting-data-via-spring – lalit

+0

Хорошо, спасибо, я буду копать больше.Иногда бывает полезно услышать, что я не полностью отлажен от конфигурации новых инструментов, когда я их изучаю. Смешно, я также разместил другой вопрос, но это проблема с загрузчиком. Я думаю, что это будет проблема загрузчика классов, поэтому я должен, вероятно, проверить, какой загрузчик классов запускал каждый из двух объектов, о которых идет речь здесь. –

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