2013-05-18 2 views
0

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

это мой контроллер

В этом BuyerRepo всегда нуль

import com.retail.exception.InvalidIdException; 
import com.retail.model.Buyer; 
import com.retail.repository.BuyerRepo; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 

@Path("/buyer") 
@Component 
public class BuyerController { 

    @Autowired 
    private BuyerRepo buyerRepo; 

    @GET 
    @Produces("application/json") 
    public Buyer searchFields() throws InvalidIdException { 
     String buyerId = "51"; 
     Buyer buyer; 

     try { 
      buyer = buyerRepo.getBuyer(Long.parseLong(buyerId)); 
     } catch (NumberFormatException e) { 
      buyer = buyerRepo.getBuyer(buyerId); 
     } 

     return buyer; 
    } 
} 

В менеджере сущностей хранилища всегда пустой

это buyerRepository

import com.retail.exception.InvalidIdException; 
import com.retail.model.Buyer; 
import org.springframework.stereotype.Repository; 

import javax.persistence.NoResultException; 

@Repository 
public class BuyerRepo extends AbstractRepository { 

    public Buyer getBuyer(String buyerName) throws InvalidIdException { 
     javax.persistence.Query buyerId = entityManager.createNativeQuery("select b.buyer_id from buyer b where b.name = :name").setParameter("name", buyerName); 
     Integer id; 

     try { 
      id = (Integer) buyerId.getSingleResult(); 

     } catch (NoResultException e) { 
      return null; 
     } 

     return getBuyer(id); 
    } 

    public Buyer getBuyer(long buyerId) throws InvalidIdException { 
     Buyer buyer = entityManager.find(Buyer.class, buyerId); 
     if (buyer == null) throw new InvalidIdException("Invalid Article ID"); 
     return buyer; 
    } 
} 

это applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 

    <context:annotation-config/> 
    <context:component-scan base-package="com.retail"/> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.postgresql.Driver"/> 
     <property name="url" value="jdbc:postgresql://localhost/retail"/> 
     <property name="username" value="retail_user"/> 
     <property name="password" value="password"/> 
    </bean> 

    <bean id="entityManagerOne" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 

     <property name="packagesToScan" value="com.retail"/> 

     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="showSql" value="true"/> 
       <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"/> 
      </bean> 
     </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerOne"/> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    </beans> 

это сервлет-context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation="http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <mvc:annotation-driven /> 
    <context:annotation-config /> 

    <context:component-scan base-package="com.retail" /> 

</beans> 

это web.xml

<?xml version="1.0" encoding="UTF-8"?> 

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/j2ee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
     http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"> 

    <servlet> 
     <servlet-name>retail</servlet-name> 

     <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 

     <init-param> 
      <param-name>com.sun.jersey.config.property.packages</param-name> 
      <param-value>com.retail.web</param-value> 
     </init-param> 

     <init-param> 
      <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
      <param-value>true</param-value> 
     </init-param> 

     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 

     <servlet-name>retail</servlet-name> 

     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      classpath:applicationContext.xml 
      /WEB-INF/servlet-context.xml 
     </param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 

    <welcome-file-list> 
     <welcome-file>/WEB-INF/views/index.jsp</welcome-file> 
    </welcome-file-list> 

</web-app> 
+0

Является ли хранилище в пакете com.retail? –

+0

в retail.repository пакете –

+0

я решил нулевой buyerRepo используя @Inject вместо Autowired –

ответ

0

Вы должны подключить интерфейс вместо класса , так что есть два способа:

  • Для того, чтобы BuyerRepo реализовать один интерфейс

  • использованияКонтактной @Inject или @Resource вместо @Autowired

0

Похоже, ваш buyerRepo не имеет никакого публичного сеттера , Также невозможно установить его через конструктор. Как насчет того, чтобы написать сеттер для него и вместо этого поставить @Autowired аннотацию на сеттер. Вот так:

@Repository 
public class BuyerRepo extends AbstractRepository { 

     private BuyerRepo buyerRepo; 

     @Autowired 
     public void setBuyerRepo(BuyerRepo buyerRepo) 
     { 
      this.buyerRepo = buyerRepo; 
     } 
     //...Other code is omitted. 
} 
+0

я хочу autowire в контроллере не в самом buyerRepo –

1

Вы можете попробовать использовать SpringServlet вместо контейнера сервлетов, снабженного трикотажем, для достижения интеграции Jersey-Spring.

<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 

Документация для этого класса состояний:

сервлет или фильтр для развертывания корневых классов ресурсов с весны интеграции. Этот класс расширяет ServletContainer и запускает приложение WebApplication с использованием Spring-ComponentProviderFactory, основанного на Spring, с помощью SpringPropertyProviderFactory, например, классы ресурсов и провайдера , объявленные и управляемые Spring. Классы весенних бобах, объявленные с использованием конфигурации на основе XML или конфигурации на основе автоматической проводки, будут автоматически зарегистрированы, если такие классы являются корневыми классами ресурсов или классами поставщиков. Нет необходимости предоставлять параметры инициализации для объявления классов в web.xml, если не требуется сочетание управляемых классов Spring и Jersey- . Сервлет поддерживает конфигурацию дочерних приложенийКонтексты, см. CONTEXT_CONFIG_LOCATION.

0

Я сталкивался с этой ситуацией, вам нужно добавить файл JAR

Gradle проект:

compile group: 'org.glassfish.jersey.ext', name: 'jersey-spring3', version: '2.22.2'

Maven проекта:

<dependency> 
    <groupId>org.glassfish.jersey.ext</groupId> 
    <artifactId>jersey-spring3</artifactId> 
    <version>2.22.2</version> 
</dependency> 

другое решение веб .xml файл:

<servlet> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>cn.ice</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

другое решение web.xml файл