使业务域对象可用于嵌入式Jetty服务器中的Jersey Servlet上下文

英文鲍勃

使用以下依赖项(Gradle):

  • org.glassfish.jersey.containers:jersey-container-servlet:2.22.2

  • org.eclipse.jetty:jetty-servlet:9.3.2.v20150730

我有一个嵌入式Jetty服务器,带有Jersey servlet容器...类似这样的东西...

package mypkg.rest.jersey;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.server.ServerProperties;
import org.glassfish.jersey.servlet.ServletContainer;
import se.transmode.tnm.alarm.api.AlarmRetrieval;
import mypkg.rest.RestServer;
import mypkg.rest.jersey.serviceImpl.ModelAdapter;

public class JerseyBasedRestServer implements RestServer {

public static final int INITIALIZE_ON_USE = 0;
private Server server;
private final ServletContextHandler context;
private final ServletHolder servlet;
private final ModelAdapter modelAdapter;

public JerseyBasedRestServer(BusinessObjects businessObjects) {
    this.modelAdapter = new ModelAdapter(businessObjects);  //I want this instance to somehow be available for my ServletContainer to use.

    context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    servlet = context.addServlet(ServletContainer.class, "/*");
    servlet.setInitOrder(INITIALIZE_ON_USE);
    servlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "mypackage.jersey.generated.api.service");
    servlet.setInitParameter(ServerProperties.MEDIA_TYPE_MAPPINGS, "json : application/json");
    context.setContextPath("/");
}

private void startServlet() {
    try {
        servlet.start();
        servlet.initialize();
    } catch (Exception e) {
        log.error("Failed to initialize servlet. {}", e.getMessage());
    }
}

@Override
public void init(int port) {
    server = new Server(port);
    server.setHandler(context);
    try {
        server.start();
        server.join();
        startServlet();
    } catch (Exception e) {
        log.error("Failed to start jetty server for rest interface");
    } finally {
        server.destroy();
    }
}

Jersey Container将运行使用Swagger代码生成工具生成的服务器代码和模型

https://github.com/swagger-api/swagger-codegen#getting-started

提供生成的模型JacksonJsonProvider,和一个RestApi类:

package mypackage.jersey.generated.api.service

Path("/")
public class RestApi  {
   private final RestApiService delegate = new RestApiServiceImpl(); //Integration point of the generated code

   @GET
   @Path("/list/")
   @Consumes({ "application/json" })
   @Produces({ "application/json" })
   public Response retrieveAlarmList(@Context SecurityContext securityContext) throws NotFoundException {
    return delegate.retrieveAlarmList(securityContext);
   }
}

为了集成生成的代码,我们需要RestApiServiceImpl自己实现

ModelAdapter的工作是对我们的业务对象转换为生成的休息模式。

所以问题是,在这种情况下ModelAdapter如何使我们的业务对象适配器实例位于Jersey servlet上下文之外,可用于RestApi该类RestApiServiceImpl

我有种从阅读过去24小时内,我需要通过码头,泽西岛,或其他一些图书馆或者使用某种语境依赖注入的理解(焊接似乎出现了很多),并尝试各种组合@Inject@Context等等等等,但得出的结论是我不知道自己实际上在做什么……我什至不确定我是否对这种情况了解得足够多,无法正确地表达我的问题。

可根据要求提供更多信息。

任何帮助表示赞赏。

编辑:在此处添加了指向https://github.com/englishbobster/JersetAndJetty的链接

使用@peeskillets建议,但仍然无法正常工作。

保罗·萨姆索塔

使DI起作用的第一件事是AbstractBinder这是使对象可用于注入的地方。

class Binder extends AbstractBinder {
    @Override
    protected void configure() {
       bind(modelAdapter).to(ModelAdapter.class);
    }
}

然后,您需要在泽西岛注册活页夹。最简单的方法是在泽西岛(Jersey's)注册ResourceConfig在您的情况下,您不使用一个。您正在“ web.xml”中配置所有内容。为此,您应该看一下这篇文章

如果您想将配置更改为使用ResourceConfig,我个人希望使用,则可以执行此操作

package com.some.pkg;

public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        packages("mypackage.jersey.generated.api.service");
        property(ServerProperties.MEDIA_TYPE_MAPPINGS, "json : application/json");
        register(new Binder());
    }
}

然后使用Jetty进行配置,您可以

servlet.setInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, 
                         "com.some.pkg.JerseyConfig");

现在,您可以删除其他两个init参数,因为您正在中配置它ResourceConfig

没有任何init-params的另一种方法是执行

ResourceConfig config = new JerseyConfig();
ServletHolder jerseyServlet = new ServletHolder(ServletContainer(config));
context.addServlet(jerseyServlet, "/*");

在此处查看最后一个代码段的完整示例

现在,您只需ModelAdapter在泽西岛的任何地方注入

在田野里

@Inject
private ModelAdapter adapter;

或在建设者中

@Inject
public RestApi(ModelAdapter adapter) {
    this.adapter = adapter;
}

或方法参数

@GET
public Response get(@Context ModelAdapter adapter) {}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在JavaScript中获取servlet上下文

在WAR文件中定义Servlet上下文

如何将对象的当前状态保存到Servlet的上下文路径或从Servlet的上下文路径获取对象的当前状态

将列表对象过滤到jsp页面中的servlet上下文中

如何访问servlet上下文侦听器中的属性?

Flink 上下文与触发器上下文

如何在Java Servlet上下文中获取和设置全局对象

如何获取已在Java Servlet上下文中设置的全局对象

ViewPager中的上下文

在Spring Boot中使用多个分派器Servlet / Web上下文

在Spring中将侦听器添加到servlet上下文

将Servlet上下文参数传递给Spring MVC控制器

如何在Jetty 9.4.x中的servlet上下文中动态添加和删除servlet?

阻止Servlet上下文在init方法中初始化

单独的WAR中的Servlet-部分共享其上下文根

在tomcat集群环境中获取servlet上下文变量数据

在容器外部的POJO中检索servlet上下文,会话和请求

更改JHipster中的servlet上下文路径,以匿名用户身份自动登录

找不到Servlet上下文:NetBeans中的Spring 4 Hibernate 4 Maven JSF PrimeFaces

Spring MVC Web应用程序中的根上下文和调度程序Servlet上下文到底是如何?

如何在没有 HttpServlet 或 HttpServletRequest 的情况下获取服务器/Servlet 上下文?

添加一个Servlet以在Intershop 7.4应用程序服务器上下文中运行

如何使用程序创建的父上下文在嵌入式Servlet 3环境中创建基于Spring(4)XML的WebApplicationContext?

android服务,上下文,构建器

在Servlet 2.3的init方法中获取上下文路径(因此没有ServletContext#getContextPath()可用)

服务中的上下文绑定错误

在服务中获取上下文

在 MoleculerJS 中构建上下文对象

[[作用域]]和执行上下文