2013-09-09 1 views
1

Я работаю над реализацией 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 в grizzly как сервлет

Кажется, что 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(); 
    } 
} 
+0

HttpServlet реализует сервлет (через GenericServlet), поэтому это не должно быть проблемой. Это проблема времени компиляции? IMO ServletRegistration swaggerServletRegistration = ctx.addServlet ("JerseyJaxrsConfig", com.wordnik.swagger.jersey.config.JerseyJaxrsConfig.class); будет лучшим эквивалентом. – alexey

+0

@alexey - Правильно, но проблема в том, что 'JerseyJaxrsConfig расширяет Servlet' и не реализует HttpServlet – Webnet

+0

, это не должно быть проблемой. Можете ли вы PLS. создавать и делиться тестовой записью (проект на основе maven был бы замечательным)? – alexey

ответ

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()); 
    } 
} 

я откровенно понятия не имеют о большинстве, что вы (String []), но если вы пытались издеваться над веб-контекстом, чтобы передать эти значения 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, поэтому я использовал первое заклинание, но ваш пробег может отличаться.

Надеюсь, что это поможет!