Java &引用;出版「;对象通过http访问
我有一个带有状态和不可序列化字段的对象,比如线程,我想调用它上的函数,就像通过RMI但通过http调用函数一样。我不想扩大规模,我在一个孤立的网络。我目前正在使用Jetty,如下所示:Java &引用;出版「;对象通过http访问,java,jersey,jetty,jax-rs,Java,Jersey,Jetty,Jax Rs,我有一个带有状态和不可序列化字段的对象,比如线程,我想调用它上的函数,就像通过RMI但通过http调用函数一样。我不想扩大规模,我在一个孤立的网络。我目前正在使用Jetty,如下所示: public class ObjectHandler extends AbstractHandler { MyStatefulObject obj; public void handle(String target, Request baseRequest, HttpServletReques
public class ObjectHandler extends AbstractHandler {
MyStatefulObject obj;
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String action = request.getParameter("action");
switch (action) {
case "method1":
obj.method1(request.getParameter("some-parameter"));
break;
case "method2":
obj.method2(request.getParameter("some-other-parameter"));
break;
}
baseRequest.setHandled(true);
}
}
@Path("/")
public class MyStatefulObject {
MyStatefulObject(Parameter param1, Param) {
//some building stuff
}
@POST
@Path("/path1")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON + "; charset=UTF-8")
void method1(Parameter param) {}
@POST
@Path("/path2")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON + "; charset=UTF-8")
Object method2(Parameter param) {
return new Object();
}
这有点奇怪。我想使用类似servlet的东西,使用不同的方法来区分要执行的操作,或者使用JAX-RS来使用调用url来区分要执行的操作。但这两种方法都是无状态的,也就是说,我无法将对象传递给servlet,而且,至少在jersey中,构造是使用类进行的,而不是使用类的和实例,因此我无法控制MyStatefulObject
对象的构造。那么,有没有一个库,比如说,为一个对象添加注释并将其传递给服务器实例,然后开始侦听请求?我想做这样的事情:
public class ObjectHandler extends AbstractHandler {
MyStatefulObject obj;
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String action = request.getParameter("action");
switch (action) {
case "method1":
obj.method1(request.getParameter("some-parameter"));
break;
case "method2":
obj.method2(request.getParameter("some-other-parameter"));
break;
}
baseRequest.setHandled(true);
}
}
@Path("/")
public class MyStatefulObject {
MyStatefulObject(Parameter param1, Param) {
//some building stuff
}
@POST
@Path("/path1")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON + "; charset=UTF-8")
void method1(Parameter param) {}
@POST
@Path("/path2")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON + "; charset=UTF-8")
Object method2(Parameter param) {
return new Object();
}
}
在外面的时候,我会:
Server server = new Server(8081);
server.setHandler(new MyStatefulObject(param));
server.start();
server.join();
有没有一个图书馆能让我做到这一点?正如我之前所说的,我不想扩展(这是在一个小型网络中运行的),也没有安全问题。我只想“发布”一个对象。最后,Jersey确实允许发布有状态的对象,使用ResourceConfig类和一个对象(与我发现的更频繁的使用类相反)。有趣的是,他们想做完全相反的事。我们只需在ResourceConfig中注册一个对象
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import java.net.URI;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.jetty.JettyHttpContainerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import javax.inject.Singleton;
@Path("calculator")
public class Calculator {
int i = -1;
public Calculator(int i) {
this.i = i;
}
@GET
@Path("increment")
@Produces(MediaType.APPLICATION_JSON)
public String increment() {
i = i + 1;
return "" + i;
}
public static void main(String[] args) throws Exception {
ResourceConfig resourceConfig = new ResourceConfig();
resourceConfig.register(new Calculator(10));
Server server = JettyHttpContainerFactory.createServer(new URI("http://localhost:8080"), resourceConfig);
server.start();
}
}
您可以在应用程序的其他部分创建有状态对象,并将其作为Jersey controller类中的静态字段。