簡體   English   中英

空接線領域

[英]Null Autowired Fields

我目前正在嘗試將服務器設置為在Tomcat上使用jersey,spring和hibernate。 目前,該項目使用Maven構建並部署在tomcat上。 當我在調試模式下運行並調用某些GET方法時,將調用com.xyzrequest包中正確的@GET方法,但是此類中的自動裝配服務類為null,因此我無法弄清原因。 我懷疑這是一個配置問題,但是我對此有些陌生,不確定我哪里出錯了。

服務器啟動時,我在控制台中得到了這個

....
Sep 13, 2013 11:18:56 PM com.sun.jersey.spi.spring.container.servlet.SpringServlet getContext
INFO: Using default applicationContext
Sep 13, 2013 11:18:56 PM com.sun.jersey.spi.spring.container.SpringComponentProviderFactory registerSpringBeans
INFO: Registering Spring bean, testRequestService, of type com.x.y.z.TestRequestService as a root resource class
....

所以看起來請求bean正在正確初始化

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

<context:component-scan
    base-package="com.x.y.z.request, com.x.y.z.service, com.x.y.z.dao" />

<context:annotation-config/>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver" />
    <property name="url" value="jdbc:postgresql://localhost:5432/db" />
    <property name="username" value="user" />
    <property name="password" value="password" />
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
     </property>
     <property name="persistenceUnitName" value="serverPersistenceUnit" />
     <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
</bean>

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

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

web.xml(我將*寫為'*',因為它注釋掉了文本塊)

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

<display-name>MyWebApp</display-name>

<description>
My Web App
</description>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</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>
<servlet>
    <servlet-name>Jersey Spring Web Application</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>com.x.y.z.request</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey Spring Web Application</servlet-name>
    <url-pattern>/webresources/'*'</url-pattern>
</servlet-mapping>

<!-- JAX RS config -->
<filter>
    <filter-name>Jersey Filter</filter-name>
    <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
    <init-param>
        <param-name>com.sun.jersey.config.feature.Trace</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.feature.Redirect</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.feature.ImplicitViewables</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.x.y.z.request</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.feature.FilterForwardOn404</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>Jersey Filter</filter-name>
    <url-pattern>/'*'</url-pattern>
</filter-mapping>
</web-app>

persistence.xml中

<?xml version="1.0" encoding="UTF-8" ?>
<persistence 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_2_0.xsd"
version="2.0">
<persistence-unit name="serverPersistenceUnit">
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    </properties>
</persistence-unit>

TestRequestService.java

@Component
@Path("/test")
public class TestRequestService 
{
    @Autowired
    private IDelegate delegate;

    @GET
    @Path("{id}") 
    @Produces(MediaType.APPLICATION_JSON)
    public List<IObject> get(@PathParam("id") int id)
    {   
         return delegate.get(id);
    } 
}

IBusinessDelegate.java

@Service
public class Delegate extends AbstractDelegate<IObject> implements IDelegate
{
    @Autowired
    private IDAO<IObject> dao;

    @Override
    public List<IObject> get(int id)
    {
        dao.get(id);
    }
}

DAO.java

@Repository
public class DAO extends AbstractDAO<IObject> implements IDAO<IObject>
{
    @Override
    public List<IObject> get(int id)
    {
        //some query here
    }
}

AbstractDAO.java

public abstract class AbstractDAO<T> implements IDAO<T>
{
    @PersistenceContext
    protected EntityManager entityManager;

    public abstract List<T> get(int id);
}

該問題的最可能原因是,Jersey未配置為使用spring應用程序上下文來獲取對象實例。 所以Jersey正在創建TestRequestSerivce的實例,這意味着Jersey將忽略@Autowired,因為它不理解它。

您是否配置了Jersey servlet以使用spring獲取控制器實例。 請參閱http://www.mkyong.com/webservices/jax-rs/jersey-spring-integration-example ,尤其要注意,用於jersey的servlet應該可以識別彈簧。

<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>com.mkyong.rest</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

事實證明,這僅僅是因為我使用錯誤的URL進行測試。 您可以在我的web.xml中看到我的servlet映射的URL模式是/ webresources / *。 如果我通過在瀏覽器中輸入localhost:8080 / my-webservice / test / 1進行測試,它將在“ / test”請求bean中命中我的斷點,但是spring不會自動裝配字段(大概是因為這是錯誤的URL模式)這個球衣/春季servlet)。 當我開始輸入localhost:8080 / my-webservice / webresources / test / 1時,一切都開始正常工作。 這是一個非常愚蠢的錯誤,但我只是假設如果jersey接聽請求,則URL是正確的,也許有人可以弄清楚為什么錯誤的URL會發生這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM