简体   繁体   中英

Error while injection in REST using Jersey/Spring with Tomcat

I'm trying to implement REST API using Jersey with Spring on Tomcat but I'm getting error:

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 implements IMyClassService

Can any one tell me why I'm getting the error? The class com.abc.service.interface.IMyClassService is an interface and cannot be instantiated.

I'll really appreciate if you can help me out!!

Thanks!

There is one point that makes me worry:

The exception comes from Jersey, not Spring. If you (like me) expect that the field serviceImpl of MyResourse is populated by the Spring framework then this is likely the problem. It seams that Jersey attempts to populate it, and fails with some configuration failure.

A quick workaround would be using Springs @Autowire instead of @Inject .

Check the reason for this exception( Right above where the exception is printed on console). I got this exception when I had multiple methods configured capable to respond to a request type. eg: /rest/getData request could possibly go to method1 and method2.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM