2016-10-28 5 views
1

Ich versuche, mit der @ Repository-Klasse in der @ServerEndpoint-Klasse annotiert zu injizieren. Aber wenn ich versuche, die Repository-Methode aufzurufen, ist die Rückgabe null. Eine andere injizierte Bohne aus diesem Paket funktioniert gut. Diese@ServerEndpoint und Spring MVC-Injektion

@ApplicationScoped 
@ServerEndpoint("/WebsocketHome/actions") 
public class WebSocketServer { 
private static final Logger LOG = Logger.getLogger(WebSocketServer.class); 

@Inject 
private SessionHandler sessionHandler; 

@Inject 
private PlaceRepository placeRepository; 

@OnMessage 
public void handleMessage(String message, Session session) { 

    JSONParser jsonParser = new JSONParser(); 

    try { 
     JSONObject jsonObject = (JSONObject) jsonParser.parse(message); 

     if ("getRooms".equals(jsonObject.get("action"))) { 
      List<Place> places = this.placeRepository.getAllPlaces(); //error is here    
     } 
     } catch (ParseException e) { 
      LOG.error(e.getMessage()); 
     } 
..... 

ist Repository-Klasse:

@Repository 
@Transactional 
public class PlaceRepository { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @SuppressWarnings("unchecked") 
    public List<Place> getAllPlaces() { 
     return this.sessionFactory.getCurrentSession().createQuery("from Place place").list(); 
    } 
} 

web.xml:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     version="3.0"> 
    <display-name>Archetype Created Web Application</display-name> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/application-context.xml</param-value> 
    </context-param> 

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

    <servlet> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

</web-app> 

app-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:tx="http://www.springframework.org/schema/tx" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:property-placeholder location="classpath:application.properties" system-properties-mode="ENVIRONMENT"/> 
    <context:component-scan base-package="com.hms.repository"/> 
    <context:component-scan base-package="com.hms.utils"/> 
    <tx:annotation-driven transaction-manager="txManager"/> 

    <import resource="security-context.xml"/> 

    <bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${db.driverClassName}" /> 
     <property name="url" value="${db.url}" /> 
     <property name="username" value="${db.username}" /> 
     <property name="password" value="${db.password}" /> 
     <!-- 
     <property name="initialSize" value="5" /> 
     <property name="maxActive" value="10" /> 
     <property name="maxIdle" value="5" /> 
     <property name="minIdle" value="2" /> 
     --> 
    </bean> 

    <bean id="sessionFactory" 
      class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="configLocation" value="classpath:hibernate.cfg.xml"/> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${db.dialect}</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hbm2ddl.auto">${db.hbm2ddl.auto}</prop> 
      </props> 
     </property> 
    </bean> 
</beans> 

Fehler erscheint nur auf den Aufruf von @OnMessage-Methode. Alle Junit @Tests der Repository-Klasse gibt feine Ergebnisse zurück. Was ist falsch in meinem Code? Entschuldigung für mein Englisch.

UPD:

Es scheint, ist, dass Problem in Session Abhängigkeit, weil Testverfahren, dass ich in @Repository hinzufügen:

public String testWS() { 
     return "Test is ok!"; 
    } 

kehrt gutes Ergebnis.

+0

Können Sie Ihre Konfiguration auch angeben? Zunächst ist zu bedenken, dass das Problem darin besteht, für Ihre Klasse eine Annotation zu verwenden. Wenn Sie @Transactional Spring verwenden, wird ein Proxy bereitgestellt und vorausgesetzt, Sie verwenden CGLIB nicht, ist der dynamische JDK-Proxy nicht mit Ihrem konkreten PlaceRepository kompatibel. –

+0

Wie Sie angefordert haben, schließe ich Konfigurationsdateien ein. –

Antwort

1

Also, sieht aus wie ich den richtigen Weg gefunden. Ich habe es in Spring websocket documentation gefunden. Es gibt einige Schritte, was ich tat:

  1. I in Typ-Ebene Anmerkung setzen:

    @ServerEndpoint (value = "/ WebsocketHome/Aktionen", Konfiguratoren = SpringConfigurator.class)

  2. Ich habe @Service und @Controller zu meinen Websocket-Klassen und dem "context: component-scan" -Pfad zu meiner app-context.xml-Datei hinzugefügt, so dass Spring entsprechende Beans finden kann.

  3. Ich fügte hinzu, die "spring-websocket" Abhängigkeit in meinem pom.xml (i Maven)

Vielleicht ist es nicht der richtige Weg, aber es ist funktioniert gut für mich.