使用带有Tomcat的Jersey / Spring在REST中注入时出错

时间:2012-02-15 07:03:25

标签: java spring jersey

我正在尝试在Tomcat上使用Jersey和Spring实现REST API,但我收到了错误:

INFO: Root resource classes found: class com.abc.restrequest.MyClass
Feb 15, 2012 6:35:24 AM com.sun.jersey.api.core.ScanningResourceConfig init
INFO: No provider classes found.
Feb 15, 2012 6:35:24 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.8 06/24/2011 12:17 PM'
Feb 15, 2012 6:35:24 AM com.sun.jersey.spi.inject.Errors processErrorMessages
SEVERE: The following errors and warnings have been detected with resource and/or provider classes:
  SEVERE: The class com.abc.service.interface.IMyClassService is an interface and cannot be instantiated.
Feb 15, 2012 6:35:24 AM org.apache.catalina.core.ApplicationContext log
SEVERE: StandardWrapper.Throwable
com.sun.jersey.spi.inject.Errors$ErrorMessagesException

的web.xml:

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

<context-param>
        <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/classes/log4j.properties</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/startup.xml,classpath*:startup.xml</param-value>
</context-param>

<servlet>
    <servlet-name>Jersey REST Service</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.abc.restrequest</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/service/*</url-pattern>
</servlet-mapping>  

MyResourse.java

@Inject
private IMyClassService serviceImpl;

@Override
public void setServiceImpl(IMyClassService impl) {
    serviceImpl = impl;     
}   

@Path("/mycall")
@POST
@Consumes ({MediaType.APPLICATION_JSON})
@Produces ({MediaType.APPLICATION_JSON})
public Response hellouser() throws ParseException {
        try {
        serviceImpl.callme();
        return Response.noContent().build();
    } catch (Exception e) {
        return Response.status(500).entity(e.getLocalizedMessage()).build();
    }
}

startup.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:cxf="http://cxf.apache.org/core"
    xmlns:jaxws="http://cxf.apache.org/jaxws"  xmlns:context="http://www.springframework.org/schema/context"
    xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
    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/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
        http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
        http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
    ">

    <context:component-scan base-package="com.abc.restrequest" />
    <context:annotation-config />

    <bean id="myrestservice" scope="prototype" class="com.abc.service.implementation.MyClassServiceImpl">
    </bean>
</beans> 

MyClassServiceImpl实现IMyClassService

任何人都能告诉我为什么会收到错误吗? com.abc.service.interface.IMyClassService类是一个接口,无法实例化。

如果你能帮助我,我真的很感激!!

谢谢!

2 个答案:

答案 0 :(得分:1)

有一点让我担心:

例外来自泽西岛,而不是春天。如果你(像我一样)期望Spring框架填充serviceImpl的{​​{1}}字段,那么这可能就是问题所在。泽西岛试图填充它的接缝,并在配置失败时失败。

快速解决方法是使用Springs MyResourse而不是@Autowire

答案 1 :(得分:0)

检查此异常的原因(正好在控制台上打印异常的位置)。当我配置了多个能够响应请求类型的方法时,我遇到了这个异常。 例如:/ rest / getData请求可能会转到method1和method2。