users@jersey.java.net

Re: [Jersey] Re: Spring jersey request scope issue

From: Paul Sandoz <Paul.Sandoz_at_Sun.COM>
Date: Wed, 19 May 2010 18:33:19 +0200

Hi Philip

You need to add another context listener

org.springframework.web.context.request.RequestContextListener

   .contextListenerClass(RequestContextListener.class)


For more details see here:

   http://blogs.sun.com/enterprisetechtips/resource/webnew.txt
   http://blogs.sun.com/enterprisetechtips/entry/jersey_and_spring

Paul.

On May 18, 2010, at 7:44 PM, Philip Verdemato wrote:

> Hi,
>
> I have an issue with unit testing some request scoped jersey calls.
>
> My ACResource class gets picked up fine by spring:
>
>
> @Path("/{accType}/{acc}")
> @Component
> @Scope("request")
> public class ACResource {
> // The Java method will process HTTP GET requests
> @GET
> @Produces(MediaType.APPLICATION_JSON)
> public MappingsBean getAccession(@PathParam("accType") String
> accType, @PathParam("acc") String acc) {
> System.out.println("Getting JSON");
> MappingsBean mb = new MappingsBean();
> mb.add(accType,acc);
> return mb;
> }
> }
>
> But when it runs the unit test, it gives me the following error:
>
> SEVERE: service exception:
> org.springframework.beans.factory.BeanCreationException: Error
> creating bean with name 'ACResource': Scope 'request' is not active
> for the current thread; consider defining a scoped proxy for this bean
> if you intend to refer to it from a singleton; nested exception is
> java.lang.IllegalStateException: No thread-bound request found: Are
> you referring to request attributes outside of an actual web request,
> or processing a request outside of the originally receiving thread? If
> you are actually operating within a web request and still receive this
> message, your code is probably running outside of
> DispatcherServlet/DispatcherPortlet: In this case, use
> RequestContextListener or RequestContextFilter to expose the current
> request.
> at
> org
> .springframework
> .beans
> .factory
> .support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:312)
>
>
> The unit test code I use is:
>
> public class ACResourceTest extends JerseyTest {
>
> public ACResourceTest() throws Exception {
> super(new
> WebAppDescriptor.Builder("com.phil.ie.acmap.resources")
> .contextPath("AccMapper")
> .contextParam("contextConfigLocation",
> "classpath:applicationContext.xml")
> .servletClass(SpringServlet.class)
> .contextListenerClass(ContextLoaderListener.class)
> .build());
>
> System.out.println("SETUP OK--------");
> }
>
> @Test
> public void testAccGet() {
>
> WebResource webResource = resource();
> String responseMsg =
> webResource
> .path
> ("XYZ
> ").path("ZZZ").accept(MediaType.APPLICATION_JSON).get(String.class);
> assertTrue( responseMsg.length() > 0);
> }
> }
>
> The resource() call in testAccGet() works, and then it produces the
> error.
>
> I'm guessing that Spring is not initialising the Bean right. If I
> change the @Scope on ACResource to 'singleton' it works.
> Does anyone have any idea what I am doing wrong ?
> Here are my maven deps:
>
>
> <dependency>
> <groupId>com.sun.jersey</groupId>
> <artifactId>jersey-server</artifactId>
> <version>1.2</version>
> </dependency>
> <dependency>
> <groupId>com.sun.jersey.contribs</groupId>
> <artifactId>jersey-spring</artifactId>
> <version>1.2</version>
> </dependency>
> <dependency>
> <groupId>com.sun.jersey.jersey-test-framework</groupId>
> <artifactId>jersey-test-framework-grizzly</artifactId>
> <version>1.2</version>
> <scope>test</scope>
> </dependency>
> <dependency>
> <groupId>com.sun.jersey.jersey-test-framework</groupId>
> <artifactId>jersey-test-framework-external</artifactId>
> <version>1.2</version>
> <scope>test</scope>
> </dependency>
>
>
> My application context looks like:
>
> <context:component-scan base-package="com.phil.ie.acmap.resources"/>
>
>
> My web.xml contains:
>
> <context-param>
> <param-name>contextConfigLocation</param-name>
> <param-value>classpath:applicationContext.xml</param-value>
> </context-param>
> <listener>
> <listener-class>org.springframework.web.context.ContextLoaderListener
> </listener-class>
> </listener>
> <listener>
> <listener-class>org.springframework.web.context.request.RequestContextListener
> </listener-class>
> </listener>
> <servlet>
> <servlet-name>AccMapper</servlet-name>
> <servlet-
> class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</
> servlet-class>
> <load-on-startup>1</load-on-startup>
> </servlet>
> <servlet-mapping>
> <servlet-name>AccMapper</servlet-name>
> <url-pattern>/*</url-pattern>
> </servlet-mapping>
>
> Many thanks in advance,
>
> Phil
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>