Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc Restlet+Spring应用程序:Tomcat服务器需要重新启动才能使不同的HTTP方法成功工作_Spring Mvc_Restlet - Fatal编程技术网

Spring mvc Restlet+Spring应用程序:Tomcat服务器需要重新启动才能使不同的HTTP方法成功工作

Spring mvc Restlet+Spring应用程序:Tomcat服务器需要重新启动才能使不同的HTTP方法成功工作,spring-mvc,restlet,Spring Mvc,Restlet,下面是我的应用程序SpringRestlet集成实现的详细信息 Web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"> <display-name>My work</display-name> <context-param> <param-name>cont

下面是我的应用程序SpringRestlet集成实现的详细信息

Web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:web="http://xmlns.jcp.org/xml/ns/javaee">
  <display-name>My work</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
  </context-param>
  <servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>
控制器类:

package com.mycompany.controller;

import java.io.IOException;

import javax.annotation.PostConstruct;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.restlet.Application;
import org.restlet.Context;
import org.restlet.Restlet;
import org.restlet.ext.servlet.ServletAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.DispatcherServlet;

@Controller
public class RestletController extends DispatcherServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Autowired
    private Restlet root;

    @Autowired
    private Context context;

    private ServletAdapter adapter;

    public RestletController() {
    }

    @PostConstruct
    public final void postConstruct() {
        final Application application = new Application(this.context);
        application.setInboundRoot(this.root);

        this.adapter = new ServletAdapter(this.getServletContext());
        this.adapter.setNext(application);
    }

    @RequestMapping("/**")
    public final void request(final HttpServletRequest request,
            final HttpServletResponse response) throws ServletException,
            IOException {
        this.adapter.service(request, response);
    }
}
服务器资源类:

package com.mycompany.resource;

import java.util.Collection;

import org.json.JSONArray;
import org.json.JSONObject;
import org.restlet.data.MediaType;
import org.restlet.ext.json.JsonRepresentation;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
import org.restlet.resource.Get;
import org.restlet.resource.Post;
import org.restlet.resource.ServerResource;
import org.springframework.beans.factory.annotation.Autowired;

import com.mycompany.model.Region;
import com.mycompany.service.RegionService;

public class RegionsResource extends ServerResource {

    @Autowired
    private RegionService regionService;

    @Get
    public Representation doGet() {

        String errString = "";
        try {

            return this.toJSONArray(this.regionService.readAllRegions());

        } catch (Exception e) {
            e.printStackTrace();
            return new StringRepresentation(errString,
                    MediaType.APPLICATION_JSON);
        }
    }

    @Post("json")
    public Representation doPost(Representation entity) {
        String errString = "";

        try {
            JsonRepresentation represent = new JsonRepresentation(entity);
            JSONObject jsonobject = represent.getJsonObject();

            Region region = new Region();
            region.setRegId(jsonobject.getInt("regId"));
            region.setRegName(jsonobject.getString("regName"));

            this.regionService.createRegion(region);

            return new JsonRepresentation(region);

        } catch (Exception e) {
            e.printStackTrace();
            return new StringRepresentation(errString,
                    MediaType.APPLICATION_JSON);
        }
    }

    private Representation toJSONArray(final Collection<?> collection) {
        final JSONArray result = new JSONArray();
        for (final Object bean : collection) {
            result.put(new JSONObject(bean));
        }
        return new JsonRepresentation(result);
    }

}
我正在EclipseIDE中的Tomcat服务器上运行应用程序

**为了描述问题所在,我将逐步详细说明我正在使用REST客户端进行测试的测试场景:**

当我测试HTTPGET时,应用程序运行良好,并且调用了服务器资源类的表示doGet方法。但是当我测试HTTPPOST时,会调用相同的表示doGet。 我重新启动Tomcat服务器并测试HTTPPOST,这次应用程序正确地调用了服务器资源类的Representation doPostRepresentation实体方法。但是,当我测试HTTPGET时,会调用同一个表示doPostRepresentation实体。 因此,我注意到每次执行都被路由到与上次HTTP方法类型调用对应的方法。 通过Tomcat服务器重启,第一个请求被路由到正确的方法,但随后的不同HTTP方法请求没有被正确路由

请您帮助理解,为什么需要重新启动服务器?如何纠正

当我有org.restlet.ext.servlet.ServerServlet而没有基于Spring集成的实现时,我没有遇到这个问题

希望,我已经提供了所有的细节来解释这个问题


谢谢,

我还没有花时间来清楚地了解发生了什么。 但我只是想知道为什么要系统地重写SpringFindercreate方法。我只会使用提供的构造函数:

router.attach("/service/regions", new SpringFinder(getContect(), RegionsResource.class);

finder专门为每个传入呼叫实例化ServerResource。

Hi Thierry,感谢您的关注。RegionResource已定义为Spring@Bean。如果不实例化它,就不会注入RegionService中RegionResource的依赖项,我在this.RegionService.readAllRegions行中得到NullPointerException。您是否怀疑这可能是原始问题的原因?
router.attach("/service/regions", new SpringFinder(getContect(), RegionsResource.class);