使业务域对象可用于嵌入式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条评论
登录后参与评论

相关文章

来自分类Dev

在JavaScript中获取servlet上下文

来自分类Dev

如何使用Grizzly嵌入式服务器在Jersey-Spring中配置现有的应用程序上下文?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Flink 上下文与触发器上下文

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

android服务,上下文,构建器

来自分类Dev

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

来自分类Dev

服务中的上下文绑定错误

来自分类Dev

Log4j2:无法使用Servlet上下文侦听器设置MDC密钥

来自分类Dev

突变隐式“上下文”参数

来自分类Dev

opencensus - 顯式上下文管理

来自分类Dev

用于DelegatingFilterProxy的单独Spring上下文

来自分类Dev

用于DelegatingFilterProxy的单独Spring上下文

来自分类Dev

从助手服务重置上下文

来自分类Dev

实体框架对象上下文刷新

来自分类Dev

python对象的布尔上下文

来自分类Dev

执行上下文和((此对象))

来自分类Dev

导出+导入对象与上下文

Related 相关文章

  1. 1

    在JavaScript中获取servlet上下文

  2. 2

    如何使用Grizzly嵌入式服务器在Jersey-Spring中配置现有的应用程序上下文?

  3. 3

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

  4. 4

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

  5. 5

    Flink 上下文与触发器上下文

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

    android服务,上下文,构建器

  18. 18

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

  19. 19

    服务中的上下文绑定错误

  20. 20

    Log4j2:无法使用Servlet上下文侦听器设置MDC密钥

  21. 21

    突变隐式“上下文”参数

  22. 22

    opencensus - 顯式上下文管理

  23. 23

    用于DelegatingFilterProxy的单独Spring上下文

  24. 24

    用于DelegatingFilterProxy的单独Spring上下文

  25. 25

    从助手服务重置上下文

  26. 26

    实体框架对象上下文刷新

  27. 27

    python对象的布尔上下文

  28. 28

    执行上下文和((此对象))

  29. 29

    导出+导入对象与上下文

热门标签

归档