首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RestEasy - ResteasyServletInitializer失败

RestEasy - ResteasyServletInitializer失败
EN

Stack Overflow用户
提问于 2014-11-12 17:01:31
回答 1查看 3.8K关注 0票数 4

所以..。

我已经能够配置一个RestEasy服务,并且使它在Windows8Ubuntu上的Eclipse中工作,但是当我将它部署到安装在Ubuntu上的Tomcat 7上时,它就不能工作了!

当我在Eclipse上启动tomcat时,我收到了这样的消息:

启动Servlet引擎: Apache /7.0.29 11月12,2014 :00:06下午4:06 org.apache.catalina.core.ApplicationContext日志 信息:初始化Spring 11月12,2014 :00:07下午4:07 org.apache.catalina.core.ApplicationContext日志 信息:初始化Spring FrameworkServlet 'MessageBrokerServlet‘ 信息2014-11-12 16:00:08,001 org.jboss.resteasy.spi.ResteasyDeployment -部署javax.ws.rs.core.Application: class javax.ws.rs.core.Application

但是这最后一行不在ubuntu =>上tomcat服务器的日志中,因此当我调用Rest服务(通过javascript /jsapi)时,我得到了以下消息:

代码语言:javascript
复制
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)

null (我想)是generateEtag()方法的generateEtag(),它在Eclipse中启动时使用我的RestService填充。

我不知道ResteasyServletInitializer为什么会启动/启动,所以如果有人遇到这种情况(以及解决方案^^),请帮助我T_T

下面是我使用的配置:

申请声明:

代码语言:javascript
复制
@ApplicationPath("/resteasy")
public class MarkersApplication extends Application {

}

服务:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
        ...
        <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>
        ...

以及包含内容/WEB-INF/services/javax.servlet.ServletContainerInitializer的文件org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-13 11:38:18

好的,我找到了\o/,对于那些如何解决这个问题的人,这里有一个解决方案:

在web.xml中添加servlet声明:

代码语言:javascript
复制
<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>

并重写SubApplication上的方法:

代码语言:javascript
复制
@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;
    }

}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26892417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档