通过http“发布”对象

时间:2016-02-16 20:03:01

标签: java jersey jetty jax-rs

我有一个带有状态和非可序列化字段的对象,比如线程,我会调用它上面的函数,就像通过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);
    }
}

这有点奇怪。我想使用像Servlets这样的东西,并使用不同的方法来区分要执行的操作,或者使用JAX-RS来使用调用url来分辨要执行的操作。但是这两种方法都是无状态的,也就是说,我不能将一个对象传递给一个servlet,并且,至少在运动衫上,构造是用类来完成的,而不是它的实例,所以我无法控制构造MyStatefulObject对象。那么,是否有一个库,比方说,注释一个对象并将其传递给服务器实例并开始收听请求?我想做这样的事情:

@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();

是否有图书馆让我能够做到这一点?正如我之前所说,我不想扩展(这是在小型网络中运行)并且没有安全问题。我只是想“发布”一个对象。

1 个答案:

答案 0 :(得分:0)

最后,Jersey确实允许发布有状态对象,使用带有对象的ResourceConfig类(而不是Class,这是我经常发现的用法)。 this question中有趣的原因他们想做的恰恰相反。我们只需在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();
    }
}