CustomerServiceImpl.java
这是REST端点(部分代码)
package com.samples.service.impl;
@Path("customers")
public class CustomerServiceImpl implements CustomerService {
private static Logger logger = Logger.getLogger(CustomerServiceImpl.class);
@Autowired
CustomerBO customerBO;
这里是CustomerBOImpl.java
(部分代码)
package com.samples.BO.impl;
@Component
public class CustomerBOImpl implements CustomerBO {
@Autowired
CustomerDAO customerDAO;
@Autowired
CustomerAdapter customerAdapter;
CustomerDAOImpl.class package com.samples.DAO.impl;
@Repository
public class CustomerDAOImpl implements CustomerDAO {
这是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"
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.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<context:property-placeholder location="classpath*:database.properties"/>
<context:component-scan base-package="com.samples"/>
<context:annotation-config />
</beans>
这是我得到的前几行例外。
http-bio-8090-exec-1] [class: CustomerServiceImpl] INFO - list all customers
[http-bio-8090-exec-1] [class: CustomerServiceImpl] INFO - customerBO is null
May 08, 2014 10:55:29 AM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
java.lang.NullPointerException
at com.samples.service.impl.CustomerServiceImpl.getAllCustomers(CustomerServiceImpl.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvo
这是web.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web-app 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"
version="2.5">
<display-name>Employee Service</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:applicationContext.xml
</param-value>
</context-param>
<context-param>
<param-name>initializeContextOnStartup</param-name>
<param-value>true</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.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.samples.service</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>/*</url-pattern>
</servlet-mapping>
</web-app>
所以,如果我理解这是如何正常工作的,我configuring xml
通过提供我想要运行autoscan的软件包来自动扫描我的组件。以及我想要自动装配的对象。在CustomerServiceImpl
类中,我使用@autowired作为customerBO
对象,该对象本应由CustomerBOImpl.class定义上的@Component注释进行扫描。你可以帮忙解释为什么我的自动扫描没有拿起自动装配的customerBO对象吗?
感谢。
答案 0 :(得分:4)
我怀疑问题是您的CustomerServiceImpl
类是在Spring之外实例化的,可以是servlet容器,也可以显式在代码中。您需要让Spring实例化它(通过使其成为bean
等)或使用<context:spring-configured/>
。如果servlet容器实例化对象,我不确定后者是否会起作用,因为它可能取决于事件发生的顺序......
答案 1 :(得分:1)
Spring只知道autowire已标记为bean的字段。从你的代码CustomerDAO
不是一个bean。例如,要在xml配置文件中将其定义为bean,您需要添加
<bean id="customerDao" class="com.packagesNames.CustomerDaoImpl"/> in the xml file.
或者使用@Component
注释类,或者在{{1}中使用@Bean
定义它}。class。
答案 2 :(得分:1)
现在支持Jersey 2和Spring集成。
泽西岛文档:Chapter 22. Spring DI
博客:Implementing Jersey 2 Spring Integration
示例应用:Jersey's Hello World Spring WebApp
但是,在撰写本文时,不能使用Spring XML配置将Spring bean直接注入JAX-RS类。必须使用注释(@Autowired
等)。
答案 3 :(得分:0)
我遇到了同样的问题。我在资源类中注入的bean总是以NULL
的形式出现。
我花了两天的时间试图找出为什么我不能将Spring Bean注入JAX-RS资源类。然后我在Jersey documentation中找到了以下内容:
&#34;限制:
Spring bean不能通过使用直接注入JAX-RS类 Spring XML配置&#34;
注意:我在项目中使用了Jersey 2和Spring 3.x.