Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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
Java &引用;出版「;对象通过http访问_Java_Jersey_Jetty_Jax Rs - Fatal编程技术网

Java &引用;出版「;对象通过http访问

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

我有一个带有状态和不可序列化字段的对象,比如线程,我想调用它上的函数,就像通过RMI但通过http调用函数一样。我不想扩大规模,我在一个孤立的网络。我目前正在使用Jetty,如下所示:

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类中的静态字段。