Spring mvc Restlet+Spring应用程序:Tomcat服务器需要重新启动才能使不同的HTTP方法成功工作
下面是我的应用程序SpringRestlet集成实现的详细信息 Web.xml: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
<?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);