masT
masT

Reputation: 850

Integrating Atmosphere with Spring MVC

I want to provide push notifications in a Spring MVC project, using JDK 1.6 targeting all browsers. I followed this post and finally decided to go with Atmosphere.

For Server-sent events, My server controller is (source):

@Controller
public class AtmosphereController {

    @RequestMapping(value="/getTime", method=RequestMethod.GET)
    @ResponseBody
    public void websockets(final AtmosphereResource atmosphereResource) {

        final HttpServletRequest  request = atmosphereResource.getRequest();
        final HttpServletResponse response = atmosphereResource.getResponse();
        
        atmosphereResource.suspend();

        final Broadcaster bc = atmosphereResource.getBroadcaster();
        bc.scheduleFixedBroadcast(new Callable<String>() {

            public String call() throws Exception {

                return (new Date()).toString();
            }
        }, 10, TimeUnit.SECONDS);
    }
}

While running, I got org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.atmosphere.cpr.AtmosphereResource]: Specified class is an interface. In solution to this, I got this relevant post. I added this to my dispatcher-servlet.xml:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
            </list>
        </property>
    </bean>

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean id= "atmosphereResource"
            class="org.atmosphere.cpr.AtmosphereResourceImpl" />
    </mvc:argument-resolvers>
</mvc:annotation-driven>

Doing this, also results in a new error:

[cvc-complex-type.2.1: Element 'mvc:annotation-driven' must have no character or element information item [children], because the type's content type is empty.]

I've also tried this. How can I inject AtmosphereResource in Spring Controller. Do I also need to update web.xml or some other configuration file to make it work?

Upvotes: 0

Views: 1781

Answers (2)

Emanuele Righetto
Emanuele Righetto

Reputation: 720

Your argument-resolvers must be a class like this:

public class AtmosphereArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        HttpServletRequest httpServletRequest= webRequest.getNativeRequest(HttpServletRequest.class);
        return Meteor.build(httpServletRequest).getAtmosphereResource();
    }

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
            return AtmosphereResource.class.isAssignableFrom(parameter.getParameterType());
    }

}

and try this:

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean class="com.yourpackage.AtmosphereArgumentResolver" />
    </mvc:argument-resolvers>
</mvc:annotation-driven>

Upvotes: 2

jfarcand
jfarcand

Reputation: 1670

try Atmosphere 2.1.0-RC1 and following this document . All you need to do is to add the atmosphere-spring.jar to your dependency.

-- Jeanfrancois

Upvotes: 1

Related Questions