Autowired为null,不适用于Jersey + Spring

时间:2015-11-20 18:52:15

标签: java spring dependency-injection jersey mybatis

我有问题弄清楚为什么我的Jersey RESTful入口点无法找到我在app服务器启动时配置的Spring Bean。从

尝试后,它一直收到NullPointerException

Web.xml中

<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>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.testing.resource</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>

弹簧context.xml中

<context:annotation-config />
<context:component-scan base-package="com.testing.config, com.testing.repository, com.testing.workflow" />

<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>classpath:jdbc.properties</value>
    </property>
</bean>

泽西岛servlet入口点

@Component
@Produces(MediaType.APPLICATION_JSON)
@Path("/{userId}/items")
public class UserResource
{
  @Autowired
  private UserWorkFlow userWorkFlow;

  @GET
  public Response getAllItems(@PathParam("userId") String userId)
  {
    // ** NullPointerException here complains about the UserWorkFlow 
    return Response.status(200).entity(userWorkFlow.getItemsFor(userId)).build();
  }
}

服务层

我也尝试为此创建一个界面,但它没有用。

@Service
public class UserWorkFlow
{
  @Autowired
  private AllItems allItems;

  public List<Item> getItemsFor(String id)
  {
    return allItems.getItemsFor(id);
  }
}

存储库和DAO

@Repository
public class AllItems
{
  @Autowired
  private ItemSql itemSql;

  public List<Item> getItemsFor(String id)
  {
    return itemSql.getAllItemsFor(id);
  }
}

MyBatis Mapper(它有一个与之关联的XML)

public interface UserSql
{
  List<Item> getAllItemsFor(@Param("userId") String userId);
} 

我也从com.sun.jersey更改为org.glassfish.jersey但没有效果。我的想法已经用完了可能出错的地方。谁能发现我做错了什么?

3 个答案:

答案 0 :(得分:3)

我为link提供的previous question有四个完全工作示例的链接。您可以轻松地抓住其中一个示例并构建在它之上。

我将引导您完成示例中的一个。也许它太难以遵循了。我将使用Jersey 2.x with Spring XML config

首先,请确保您有the dependencies(仅显示未在pom中显示的版本的版本)

  • jersey-container-servlet: 2.22.1
  • spring-web: 3.2.3.RELEASE
  • commons-logging
  • jersey-spring3: 2.22.1。 (请注意,快照项目使用jersey-spring*4*。这尚未发布,将在下一个泽西版本中发布)

第二次,请确保您的web.xml已按顺序

第三次,将您的applicationContext.xml添加到项目类路径。

Fouth ,上一个web.xml中列出的MyApplication类。

如果你按照T的例子,你将有一个有效的例子。它可能不是您想要配置Spring组件的确切方式,但是您将有一个可以构建的工作示例并进行调整以查看哪些有效,哪些无效。当您感觉更舒服时,您可以看到其他配置样式/选项的其他示例(在此答案的第一个链接中)。

答案 1 :(得分:1)

我使用SpringBeanAutowiringSupport扩展了ServiceImpl和DAOImpl类,它解决了我的自动装配空指针异常。

答案 2 :(得分:0)

在这里您可以创建该服务的实例并访问该服务的方法。我认为这是最简单的方法。

UserService user = new UserService();
user.saveUser();