【问题标题】:How to add JerseyJaxrsConfig class to grizzly as servlet如何将 JerseyJaxrsConfig 类作为 servlet 添加到 grizzly
【发布时间】:2013-09-09 15:43:37
【问题描述】:

我正在努力实现 Swagger 以生成 API 文档。我在这里遵循配置指南:https://github.com/wordnik/swagger-core/wiki/Java-JAXRS-Quickstart,但它都是基于 XML 的,当我尝试执行我认为在运行时配置中等效的操作时,Grizzly 抱怨 - Cannot resolve method 'addServlet(java.lang.String, com.wordnik.swagger.jersey.config.JerseyJaxrsConfig)'

似乎是JerseyJaxrsConfig extends 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();
    }
}

【问题讨论】:

  • HttpServlet 实现了 Servlet(通过 GenericServlet),所以应该不是问题。是编译时问题吗? IMO ServletRegistration swaggerServletRegistration = ctx.addServlet("JerseyJaxrsConfig", com.wordnik.swagger.jersey.config.JerseyJaxrsConfig.class);会是更好的等价物。
  • @alexey - 对,但问题是JerseyJaxrsConfig extends Servlet 而不是implement HttpServlet
  • 应该没问题。你能请。创建和共享测试用例(基于 maven 的项目会很棒)?

标签: java grizzly swagger


【解决方案1】:

你走错路了。 JerseyJaxrsConfig 是一种将配置参数静态传递给 Swagger 的技巧。你可以在 startServer() 中做这样的事情

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 类,所以我使用了第一个咒语,但你的里程可能会有所不同。

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多