【问题标题】:"Publish" object through http通过http“发布”对象
【发布时间】:2016-02-16 20:03:00
【问题描述】:

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

这有点奇怪。我想使用类似 Servlet 的东西,并使用不同的方法来区分要执行的操作,或者使用 JAX-RS 来使用调用 url 来区分要执行的操作。但是这两种方法都是无状态的,也就是说,我不能将对象传递给 servlet,而且,至少在 jersey 中,构造是用类而不是它的实例进行的,所以我无法控制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();

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

【问题讨论】:

  • 您可以在应用程序的其他部分创建有状态对象,并将其作为 Jersey 控制器类中的静态字段。

标签: java jersey jetty jax-rs


【解决方案1】:

最后,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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    相关资源
    最近更新 更多