2009-05-20 22 views
7

Trong đoạn mã sau tôi gặp rắc rối với EnitityManager được tiêm của tôi, trong đó luôn hiển thị là null;Sửa Null EntityManger trong ứng dụng Spring MVC?

public class GenericController extends AbstractController { 

    @PersistenceContext(unitName = "GenericPU") 
    private EntityManager em; 

    protected ModelAndView handleRequestInternal(
      HttpServletRequest request, 
      HttpServletResponse response) throws Exception { 
     //(em == null) is always trigged 
     if (em == null) throw new NullPointerException("em is null"); 
     Collection<Generic> Generics = em.createNamedQuery("Generic.findAll").getResultList(); 

     ModelAndView mav = new ModelAndView("Generic"); 
     mav.addObject(Generics); 
     return mav; 
    } 
} 

Dưới đây là định nghĩa bean, quy định tại phối-servlet.xml.

<bean id="Generic" class="com.application.web.GenericController" /> 

EnitityManager nên được tiêm dựa trên tx: chú thích dựa trên định nghĩa trong bền bỉ-context.xml tập tin.

<?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-2.5.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> 
     <property name="url" value="removed" /> 
     <property name="username" value="removed" /> 
     <property name="password" value="removed" /> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="GenericPU" /> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="jpaDialect"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
     </property> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="showSql" value="true" /> 
       <property name="generateDdl" value="false" /> 
       <property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" /> 
      </bean> 
     </property> 
    </bean> 

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

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 

</beans> 

Các kiên trì ngữ cảnh được nạp từ 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" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    <import resource="classpath:META-INF/persistence-context.xml"/> 
</beans> 

Các classpath nhập khẩu được thực hiện bởi vì các đối tượng ORM được bao gồm như là một tập tin JAR vào dự án. Lưu ý rằng tôi tin rằng bối cảnh persistence đang được nạp, vì Spring sẽ không cho phép ứng dụng được triển khai nếu nó không thể phân tích các tệp cấu hình của nó.

Đây là số persistence.xml của tôi.

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="CoolOrmJpaPU" transaction-type="RESOURCE_LOCAL"> 
    <class>com.application.orm.jpa.Generic</class> 
    <!-- bunch more classes --> 
    </persistence-unit> 
</persistence> 

web.xml của tôi

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>*.htm</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>redirect.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

bất cứ ai có thể giúp tôi ra ở đây?

+0

Bạn tham khảo persistence-context.xml từ application-context.xml như thế nào? Sử dụng nhập? – Mark

+0

Đánh dấu, tôi đã thêm điều đó cho bạn. Xin lỗi tôi đã muốn loại trừ chi tiết, nhưng có rất nhiều cấu hình ở đây mà tôi không muốn bao gồm tất cả mọi thứ. –

Trả lời

8

Hôm nay tôi đã đủ may mắn để có thể nói chuyện với một nhà tư vấn về vấn đề này, anh ấy có thể giúp tôi sắp xếp mọi thứ. Vì vậy, vấn đề của tôi là Spring MVC đã thiết lập hai bối cảnh riêng biệt, một bối cảnh ứng dụng, được định nghĩa trong applicationContext.xml và một bối cảnh web, được định nghĩa trong dispatcher-servlet.xml.

Đậu từ một ngữ cảnh không thể nói chuyện với hạt trong ngữ cảnh khác, do đó khi tôi khởi tạo ngữ cảnh kiên trì bên trong applicationContext.xml, tôi không thể truy cập nó trong các hạt được tải bởi dispatcher-servlet.xml, tức là bộ điều khiển của tôi.

Khi Netbeans tự động tạo cơ sở cho Spring MVC của tôi, nó sẽ thiết lập mặc định này. Trong một số ứng dụng web lớn, nó sẽ có ý nghĩa để tách phần web của ứng dụng trong một ngữ cảnh khác biệt với phần còn lại của logic (kiên trì, mã kinh doanh, v.v.). Trong trường hợp của tôi, nơi tôi đang cố gắng tự động đưa người quản lý thực thể của mình trực tiếp vào bộ điều khiển của tôi, điều này đã làm việc chống lại tôi.

Để khắc phục vấn đề này tôi chuyển dòng

<import resource="classpath:META-INF/persistence-context.xml"/> 

Từ applicationContext.xml, để tôi điều phối-servlet.xml. Bộ điều khiển của tôi sau đó đã được tiêm đúng EntityManagers từ chú thích @PersistanceContext.

+0

Toàn bộ quá trình cấu hình XML cho lớp web được mô tả trong sách hướng dẫn tham khảo mùa xuân, chương 13: http://static.springframework.org/spring/docs/2.5.x/reference/mvc.html – MetroidFan2002

+0

Er, xin lỗi, không chỉ cấu hình XML mà là cấu hình nói chung - nút chỉnh sửa đã ở đâu ?! – MetroidFan2002

+0

Vậy bạn đã giải quyết nó như thế nào? Như tôi đã hiểu - ApplicationContext đóng vai trò là ngữ cảnh "root" hoặc "parent" đối với ngữ cảnh dispatcherServlet (và tất cả các ngữ cảnh khác), vì vậy tất cả các bean được định nghĩa trong ngữ cảnh ứng dụng sẽ có sẵn cho nó. ví dụ. Các bộ điều khiển thường có các hạt @Service hoặc @Component khác được chèn vào chúng, có thể được định nghĩa trong applicationContext. Vì vậy, câu trả lời của bạn không thực sự giải thích tại sao nó không hoạt động cho bạn. –

0

tôi nghĩ rằng bạn cần một file persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 

    <persistence-unit name="GenericPU"> 
    <class>com.domain.MyClass</class> 
    </persistence-unit> 

</persistence> 

Tôi nghĩ rằng nó sẽ không hoạt động nếu file có một cái tên khác nhau, đặc biệt là không vì bạn không nói với các nhà máy EntityManager tên mới bất cứ nơi nào.

+0

Tôi có một persistence.xml, tôi bỏ nó ra bởi vì tôi không nghĩ rằng sẽ là quan trọng cho vấn đề này. –

+0

Xin lỗi vì tôi đã thêm nó vào câu hỏi. –

0

Tôi từng làm việc với một phiên bản mùa xuân cũ, khi bạn phải chịu đựng setProperty() cho đậu và thiết lập thẻ propery bên trong định nghĩa mùa xuân-đậu như:

<bean id="Generic" class="com.application.web.GenericController" /> 
    <property name="em" ref="entityManager" /> 
</bean> 

Có lẽ bạn nên làm việc với transactionManager hoặc entityManagerFactory beans ...

PD: Cá nhân tôi thích cách tiêm chích phụ thuộc cũ.

0

Có bạn đã bao gồm

<context:annotation-config /> 

Trong XML mùa xuân của bạn. Tham khảo here

+0

Tôi không có điều đó, nhưng tôi tin rằng nó được bật ngầm bằng cách đặt tx: hướng chú thích. –

Các vấn đề liên quan