java - 为什么我的 Spring @Autowired 字段返回 null?

标签 java spring spring-mvc

这不是 this 的重复项问题。因此,请不要因为“重复”原因而关闭它。

<小时/>

我正在尝试将 bean Autowiring 到 java 类中。我的问题是playerDAO仍然为空并且没有被初始化。

mvc-dispatcher-service.xml

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

    <context:component-scan base-package="ngdemo"/>

    <mvc:annotation-driven/>

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="mySessionFactory"/>
    </bean>

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

PlayerDAO.java

@Repository
@SuppressWarnings({"unchecked", "rawtypes"})
public class PlayerDAO {
    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    public Player getPlayerByUsername(String username) {
      //some code
    }
}

LoginRestService.java

@Path("/v1")
@Controller
public class LoginRestService {

    @Autowired
    private PlayerDAO playerDAO;

    @Path("/login")
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public Response authenticateUser(@FormParam("username") String username,
                                     @FormParam("password") String password, @Context UriInfo request) {
     playerDAO.getPlayerByUsername(username);
     //NPE, playerDAO here is null when I'm trying to access it
    }    
}

我错过了什么?

完整代码可在此处获取:https://github.com/Ferenus/hestalis

最佳答案

我检查了您的代码,并得到了您问题的答案。

您的代码没有任何问题。

但是当你想同时使用 spring mvc 和 jersey Restfull Webservices 时,你必须做的事情比你在这里做的更多。 Bcoz jersey 不知道 spring 容器及其实现。因此,每当您请求 Web 服务时,jersey 都会完成您的请求处理,而不是 spring 框架。

因此,这里的playerDao没有注入(inject)到LoginRestService.java中,因此它(playerDao)解析为null。

因此请执行以下步骤,

第 1 步:-- 将以下 Maven 依赖项添加到您的 pom.xml

    <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
       <artifactId>jersey-spring</artifactId>
        <version>1.19.1</version>
   <dependency>

该依赖用于集成Spring和Jersey

第 2 步:- 现在创建一个 WebApplicationContext 以从 mvc-dispatcher-servlet.xml 读取所有配置信息。为此,将以下代码复制到您的 web.xml

<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

第三步:-- 现在使用 jersey 框架提供的类 com.sun.jersey.spi.spring.container.servlet.SpringServlet 集成 spring 和 jersey (该类可在 jersey-spring.jar 中找到。为此,将以下代码复制到您的 web.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>ngdemo.rest</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>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

就是这样。一切都完成了。

只需更新您的 Maven 项目并在服务器中再次运行即可。

建议 当您添加依赖项( jersey-spring-1.19.1.jar )时,还有一件事是一些与 spring 相关的 jar 文件(如 spring-aop.3.0.0CR.jar、spring-bean.jar 等)包含在您的 maven 中依赖项和包含的 jar 是旧版本。所以有时你可能会得到ClassNotFoundException。所以你必须排除那些 spring 依赖项。 如果您遇到此类异常,请将以下代码复制到 jersey-spring.jar 的 元素

<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-spring</artifactId>
    <version>1.19.1</version>
    <exclusions>
        <exclusion>
            <artifactId>spring-context</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
        <exclusion>
            <artifactId>spring-core</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
        <exclusion>
            <artifactId>spring-beans</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
        <exclusion>
            <artifactId>spring-web</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
        <exclusion>
            <artifactId>spring-aop</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
    </exclusions>
</dependency>

希望这对您有帮助。让我知道您是否得到了正确的解决方案。

关于java - 为什么我的 Spring @Autowired 字段返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38038692/

相关文章:

java - 为我的 API 实现 API key

java - 事务和 JPA/Persistence.xml

java - 有没有办法在实现 @Path 的方法内部获得 REST Api 的完整 API 签名

java - Spring MVC 以编程方式登录 : No qualifying bean of type MyUserDetailsService

java - Spring mvc - 在方法内部使用 modelAttribute 而不是方法参数作为注释

java - 如何用Java处理mysql中的并发事务?

Java 输入/输出扫描器类和交互面板

java - 侵入的确切含义是什么?是什么让 Spring 非侵入性的?

java - JFormattedTextField 格式化百分比数字?

java - 如何从 Controller 内部的 URL 访问哈希值