RestEasy - ResteasyServletInitializer not working

So....

I was able to set up the RestEasy service and get it working in my Eclipse on Windows 8 , but it doesn't work when I deploy it to Tomcat 7 installed on Ubuntu!

When I started my tomcat on Eclipse I got the message:

INFO: Servlet start: Apache Tomcat / 7.0.29
new. 12, 2014 4:00:06 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext is
new. 12, 2014 4:00:07 pm org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring FrameworkServlet 'MessageBrokerServlet'
[INFO] 2014-11-12 16: 00: 08,001 org.jboss.resteasy.spi.ResteasyDeployment - Deploying javax.ws.rs.core.Application: fr.mycompany.myproject.MarkersApplication class

but this last line is missing from the tomcat server log on ubuntu => so when I call my Rest service (via javascript / jsapi) I got this message:

GRAVE: "Servlet.service()" pour la servlet RESTEasy JSAPI a généré une exception
java.lang.NullPointerException
    at org.jboss.resteasy.jsapi.JSAPIWriter.generateEtag(JSAPIWriter.java:111)
    at org.jboss.resteasy.jsapi.JSAPIWriter.writeJavaScript(JSAPIWriter.java:36)
    at org.jboss.resteasy.jsapi.JSAPIServlet.service(JSAPIServlet.java:73)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

      

and what is null (I suppose) is serviceRegistries

the generateEtag () method that gets populated by my RestService when launched in Eclipse Tomcat.

I have no clue as to why the ResteasyServletInitializer is fired by / init, so if anyone got this situation (and solution ^^) please help me T_T

Here is the configuration I'm using:

Application declaration:

@ApplicationPath("/resteasy")
public class MarkersApplication extends Application {

}

      

Service:

@Path("/markersRest")
public class MarkersRest {

    @Context
    private ServletContext  context;

    private DataService getService() {
        return WebApplicationContextUtils.getWebApplicationContext(context).getBean(DataService.class);
    }

    @POST
    @Produces(MediaType.TEXT_PLAIN)
    public Response getMarkers(@QueryParam("keyCache") String keyCache) {
        String markers = getService().getCachedMarkers(keyCache);

        return Response.ok().entity(markers).build();
    }

}

      

Web .xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0" metadata-complete="true">

    <display-name>MyProject</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/spring/spring-config.xml</param-value>
    </context-param>

    <context-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/resteasy</param-value>
    </context-param>

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

    <listener>
        <listener-class>flex.messaging.HttpFlexSession</listener-class>
    </listener>

    <!-- ************************ -->
    <!-- ******* SERVLETS ******* -->
    <!-- ************************ -->

    <servlet>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/spring/spring-flex-config.xml</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <url-pattern>/messagebroker/*</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>RESTEasy JSAPI</servlet-name>
        <servlet-class>org.jboss.resteasy.jsapi.JSAPIServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RESTEasy JSAPI</servlet-name>
        <url-pattern>/rest-js</url-pattern>
    </servlet-mapping>

</web-app>

      

pom.xml:

        ...
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-servlet-initializer</artifactId>
            <version>3.0.9.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jsapi</artifactId>
            <version>3.0.9.Final</version>
        </dependency>
        ...

      

and file /WEB-INF/services/javax.servlet.ServletContainerInitializer

with contentorg.jboss.resteasy.plugins.servlet.ResteasyServletInitializer

+3


source to share


1 answer


OK, I found \ o /, and for anyone dealing with this problem, this is the solution:

add the servlet declaration to your web.xml:

<servlet>
    <servlet-name>Resteasy</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    <load-on-startup>1</load-on-startup>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>fr.mycompany.myproject.MarkersApplication</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>Resteasy</servlet-name>
    <url-pattern>/resteasy/*</url-pattern>
</servlet-mapping>

      



And override the methods of your SubApplication:

@ApplicationPath("/resteasy")
public class MarkersApplication extends Application {

    private static final Set<Object>    singletons  = new HashSet<Object>();

    public MarkersApplication() {
        singletons.add(new MarkersRest());
    }

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>();
        return set;
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }

}

      

+5


source







All Articles