2011-12-13 2 views
0

У меня возникли трудности с автоматической компоновкой bean-компонентов в класс, который загружается как init-param в сервлет для OData4j. Я пробовал много решений, включая загрузку во времени, но, похоже, не может заставить его работать правильно, потому что, как я понимаю, класс, который передается в качестве init-param для сервлета, загружается до загрузки контекста Spring все. Ниже приведено текущее состояние моей конфигурации, есть ли способ для инъекции зависимостей в классе, загруженном таким образом? Конечная цель состоит в том, чтобы иметь ExampleProducerFactory.java (который является исходным параметром сервлета OData), который имеет компонент UserDao.Автоматическая проводка с пружиной в классе init-param сервлета

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

applicationContext.xml

<context:component-scan base-package="com.project.core"/> 
<context:spring-configured/> 
<context:load-time-weaver weaver-class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver" /> 

web.xml

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 
<!-- read the XmlWebApplicationContext for spring --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>OData</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
    <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name> 
    <param-value>org.odata4j.producer.resources.ODataResourceConfig</param-value> 
    </init-param> 
    <init-param> 
     <param-name>odata4j.producerfactory</param-name> 
     <param-value>com.wildgigs.core.odata.ExampleProducerFactory</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>OData</servlet-name> 
    <url-pattern>/example.svc/*</url-pattern> 
</servlet-mapping> 

ExampleProducerFactory.java

@Configurable(autowire= Autowire.BY_NAME) 
public class ExampleProducerFactory implements ODataProducerFactory { 

@Autowired 
private UserDao userDao; 

@Override 
public ODataProducer create(Properties arg0) { 
    InMemoryProducer producer = new InMemoryProducer("example"); 
    List<User> users = userDao.findAll(); 
    User[] usersArray = new User[users.size()]; 
    users.toArray(usersArray); 
    final User[] usersArrayFinal = usersArray; 
    producer.register(User.class, Long.class, "Users", new Func<Iterable<User>>() { 
     public Iterable<User> apply() { 
      ThreadGroup tg = Thread.currentThread().getThreadGroup(); 
      while (tg.getParent() != null) 
       tg = tg.getParent(); 
      return Enumerable.create(usersArrayFinal).take(usersArrayFinal.length); 
     } 
    }, "Id"); 


    return producer; 
} 
} 

UserDaoImpl.java

@Repository 
public class UserDaoImpl extends GenericDaoImpl<User, Long> implements UserDao,  Serializable { 

@Transactional(readOnly = true) 
public User getByUserName(String userName) { 
     Query query = getSession().createQuery("FROM User where upper(userName) = :name"); 
     query.setString("name", userName.toUpperCase()); 
     return (User) query.uniqueResult(); 
} 

} 

ответ

2

Вы должны использовать майку SpringServlet вместо ServletContrainer. С этим вместо указания resourceConfig в параметре init вы можете определить его как весенний боб.

0

Бин должен быть создан в вашей конфигурации весны для ввода в ваш класс.

<bean id="userDao" class="com.yourdomain.pacakage.UserDao"> 
+0

Извините, я забыл упомянуть о том, что UserDao аннотируется с @Repository и полностью поддерживается во всем мире в проекте. Теперь добавлен исходный вопрос. – BVSmallman

+0

UserDaoImpl автоподключен, это подкласс UserDao. Проблема не должна заключаться в конфигурации самого компонента, UserDao/UserDaoImpl правильно автоматически подключается в любом другом месте приложения, в стандартных компонентах/контроллерах/службах и т. Д. – BVSmallman