当前位置: 首页 > 知识库问答 >
问题:

如何将泽西贾克斯配置类添加到灰熊作为 servlet

窦华晖
2023-03-14

我正在实现Swagger以生成API文档。我在这里遵循配置指南:https://github.com/wordnik/swagger-core/wiki/Java-JAXRS-Quickstart但它都是基于XML的,当我尝试做我认为在运行时配置中等效的事情时,Grizzly抱怨-无法解析方法“addServlet(java.lang.String,com.wordnik.swagger.jersey.config.JerseyJaxrsConfig)”。

似乎是泽西岛议会扩展了 HttpServlet 而不是 Servlet。对我能做些什么有什么建议吗?

public class Main {

    public static final URI BASE_URI = getBaseURI();

    public static final String API_VERSION = "0.1.0";

    private static URI getBaseURI() {
        return UriBuilder.fromUri("http://localhost/").port(9998).build();
    }

    protected static HttpServer startServer() throws IOException {
        ResourceConfig rc = new PackagesResourceConfig("com.my.package.api.resources", "com.wordnik.swagger.jersey.listing");
        rc.getFeatures()
            .put(JSONConfiguration.FEATURE_POJO_MAPPING, true);

        return GrizzlyServerFactory.createHttpServer(BASE_URI, rc);
    }

    public static void main(String[] args) throws IOException {
        //System.setProperty("java.util.logging.SimpleFormatter.format", "%4$s: %5$s%n");

        System.setProperty("jsse.enableSNIExtension", "false"); //avoid unrecognized_name during SSL handshake with deconet

        AnnotationConfigApplicationContext annotationCtx = new AnnotationConfigApplicationContext(Config.class);

        //add API documentation
        WebappContext ctx = new WebappContext("Documentation", "/docs");
        ServletRegistration swaggerServletRegistration = ctx.addServlet("JerseyJaxrsConfig", new com.wordnik.swagger.jersey.config.JerseyJaxrsConfig());
        swaggerServletRegistration.setInitParameter("api.version", API_VERSION);
        swaggerServletRegistration.setInitParameter("swagger.api.basepath", BASE_URI.toString());
        swaggerServletRegistration.setLoadOnStartup(2);
        swaggerServletRegistration.addMapping("/*");

        HttpServer httpServer = startServer();

        System.out.println(String.format("Jersey app started with WADL available at " + "%sapplication.wadl\nHit enter to stop it...", BASE_URI, BASE_URI));
        System.in.read();
        httpServer.stop();
    }
}

共有1个答案

唐彬炳
2023-03-14

你走错了路。泽西岛Jaxrs配置是一个黑客,可以静态地将配置参数传递给Swagger。你可以在启动服务器()中执行类似操作

ServletConfig sc = new MyServletConfig();
JerseyJaxrsConfig jjc = new JerseyJaxrsConfig();
jjc.init(sc);

return GrizzlyServerFactory.createHttpServer(BASE_URI, rc);

下面是一个示例MyServletConfig类(我在Main上使用了一个内部类):

private static class MyServletConfig implements ServletConfig {
    private Map<String, String> initParams = new HashMap<>();

    private MyServletConfig() {
        initParams.put("api.version", "1.0.0");
        initParams.put("swagger.api.basepath", "http://localhost:8080/content-store");
    }

    @Override
    public String getServletName() {
        return "JaxRS Servlet";
    }

    @Override
    public ServletContext getServletContext() {
        return null;
    }

    @Override
    public String getInitParameter(String s) {
        return initParams.get(s);
    }

    @Override
    public Enumeration getInitParameterNames() {
        return Collections.enumeration(initParams.keySet());
    }
}

坦率地说,我对你在main(String[])中所做的大部分工作一无所知,但是如果你试图模拟一个Web上下文将这些值传递给Swagger,请删除代码。我的看起来像这样:

public static void main(String[] args) throws IOException {
    final HttpServer server = startServer();
    System.out.println(String.format("Jersey app started with WADL available at "
            + "%sapplication.wadl\nHit enter to stop it...", BASE_URI));
    System.in.read();
    server.stop();
}

尽管如此,这是另一种方法:

ConfigFactory.config().setBasePath("http://localhost:8080/content-store");

它基本上做同样的事情;我还想定制其他更具体的球衣,所以我一直使用JerseyJaxrsConfig类,所以我使用了第一个咒语,但你的里程可能会有所不同。

希望有所帮助!

 类似资料:
  • 我真的不明白泽西到底是什么。 我所知道的是,Jax-RS是一个用于构建REST web服务的API,而Jersey?我得到了一些信息,所有的说法都一样:“Jersey是JAX-RS的实现”。但这意味着什么? 如果jax-rs是一个API,为什么我们需要jersey来创建rest web服务?泽西是不是有更多的libs来瞄准jax-rs?如果是,那么jax-rs是一个不完整的API?

  • 我正在使用quickstart原型构建一个Jersey Moxy服务。我的代码运行良好,我可以得到一些JSON返回。然而,在我开发的过程中,如果我犯了一个错误,比如说请求处理程序有一个不支持的类型,我将得到一个空的500响应,这使得调试变得困难。例如,如果我用@XmlElementRef错误地修饰了一个属性,我将得到如下响应: 服务器将表现得好像什么都没发生一样: 我尝试使用日志配置文件: 这产生

  • 我有灰熊提供的球衣。 我有一个实现类。但是,为所有传入请求创建一次此类。因此,这样做: 为空。我可以将上下文注入到被调用的实际endpoint中,但这相当粗糙和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,希望在请求的ResponseFilter端找到这个对象。 必须有一种简单的方法来做到这一点。到目前为止,我看到的所有问题/答案都不适用于灰熊,或者注入了RESTendpoint调

  • 我已经设法在Jersey,HK2和一个普通的GrizzlyServer中设置了我自己的服务类的注入(到资源类中)。(基本上遵循了这个例子。) 我现在很好奇将JPA EntityManager注入我的资源类中的最佳方法是什么?(我目前正在考虑一个请求作为一个工作单元)。我目前正在研究的一个选项是以以下方式使用: null (我不想仅仅为了覆盖这个用例而依赖于重量级容器或额外的依赖注入库。)

  • 目前我在灰熊2.3.16和泽西2.14工作。我试图得到一个自定义异常处理的服务器和返回到客户端。相反,我似乎得到了通用的灰熊错误,即使正确的代码似乎被调用。 这是筛选器方法(具有“@Provider”装饰的类的一部分)。 下面是整个ExceptionMapper实现: 下面是我如何得到回复并阅读的: 当我得到实体时,它是来自Grizzly的HTML,而不是我的自定义消息。 这是调用toRespon

  • 问题内容: 我正在为具有List作为查询参数的GET服务创建Jersey客户。根据文档,可以将List作为查询参数(此信息也位于@QueryParam javadoc中),将其检出: 通常,方法参数的Java类型可以: 是原始类型; 有一个接受单个String参数的构造函数; 3. 有一个名为valueOf或fromString的静态方法,该方法接受单个String参数(例如,参见Integer.