1

API ドキュメントを生成するためにSwaggerの実装に取り​​組んでいます。私はここの構成ガイドに従っています: https://github.com/wordnik/swagger-core/wiki/Java-JAXRS-Quickstartしかし、それはすべて XML ベースであり、実行時に同等であると信じていることを実行しようとすると構成 グリズリーが文句を言う - 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();
    }
}
4

1 に答える 1

2

あなたはそれについて間違った方法で進んでいます。JerseyJaxrsConfig は、構成パラメーターを Swagger に静的に渡すためのハックです。startServer() でこのようなことを行うことができます

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

return GrizzlyServerFactory.createHttpServer(BASE_URI, rc);

MyServletConfig クラスのサンプルを次に示します (メインで内部クラスを使用します)。

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[]) で何をしているのかほとんどわかりませんが、それらの値を Swagger に渡すために Web コンテキストをモックしようとしていた場合は、コードを削除してください。私は次のようになります。

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");

基本的に同じことを行います。また、Jersey 固有の他のものをカスタマイズしたかったので、JerseyJaxrsConfig クラスを使用し続けたので、最初の呪文を使用しましたが、マイレージは異なる場合があります。

それが役立つことを願っています!

于 2013-09-14T17:47:26.697 に答える