首页 文章

无法在Java Jetty httpservlet swagger集成上找到swagger.json

提问于
浏览
0

我最近跟着这个blog在我的嵌入式jetty项目中集成了swagger但是在运行之后,我无法在任何路径组合上访问swagger.json文件 . 访问资源的servlet没有错误,但是当我尝试获取swagger.json文件时出现以下错误

http://host:7000/swagger-core  ===> HTTP ERROR 405
http://host:7000/swagger-core/swagger.json ===> HTTP ERROR 404
http://host:7000/user/swagger.json ===> HTTP ProfileServlet response, not swagger.json
http://host:7000/user ===> HTTP ProfileServlet response, not swagger.json
http://host:7000/swagger.json ===> HTTP ERROR 404
http://host:7000/api/swagger.json ===> HTTP ERROR 404
http://host:7000/ ===> Static swagger sample page (Pet store), not swagger.json

Main.java

public static void main(String[] args) throws Exception {
   Server server = initializeApi(properties);
    server.start();
    logger.info("Api resource service started");
    server.join();
 }

 private static Server initializeApi(Properties properties) {
    logger.info("Initializing user profile server...");
    new UserDao();
    Server server = new Server(Integer.parseInt(properties.getProperty(Config.JETTY_SERVICE_PORT)));
    ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
    servletContextHandler.setContextPath("/");
    server.setHandler(servletContextHandler);
    //Setup APIs

    ServletHolder apiservlet = servletContextHandler.addServlet(ProfileServlet.class, "/user/*");
    apiservlet.setInitOrder(1);
    apiservlet.setInitParameter("com.sun.jersey.config.property.packages", "com.api.resources;io.swagger.jaxrs.json;io.swagger.jaxrs.listing");
    logger.info("User profile server initialized.");

        // Setup Swagger servlet
        ServletHolder swaggerServlet = servletContextHandler.addServlet(DefaultJaxrsConfig.class, "/swagger-core");
        swaggerServlet.setInitOrder(2);
        swaggerServlet.setInitParameter("api.version", "1.0.0");

        // Setup Swagger-UI static resources
        String resourceBasePath = Main.class.getResource("/webapp").toExternalForm();
        servletContextHandler.setWelcomeFiles(new String[] {"index.html"});
        servletContextHandler.setResourceBase(resourceBasePath);
        servletContextHandler.addServlet(new ServletHolder(new DefaultServlet()), "/*");

        return server;
    }
}

ProfileServlet.java

@SwaggerDefinition(


info = @Info(
           title = "User Profile Servlet",
           version = "1.0.0",
           description = "Servlet that handles basic CRUD operations to the user profile data source",
           contact = @Contact(name = "XYZ", email = "XYZ", url = "XYZ"),
           termsOfService = "XYZ",
           license = @License(name = "XYZ", url = "XYZ")
   ),
        basePath = "/",
        consumes = {"application/json"},
        produces = {"application/json"},
        schemes = {SwaggerDefinition.Scheme.HTTP, SwaggerDefinition.Scheme.HTTPS},
        tags = {@Tag(name = "users", description = "CRUD operations on user datatype")}
)
@Api(value = "/user", description = "performs CRUD operations on a user profile")
public class ProfileServlet extends HttpServlet {
    Logger logger = Logger.getLogger(ProfileServlet.class.getSimpleName());

    public ProfileServlet(){

    }

    @ApiOperation(httpMethod = "GET", value = "Returns a list of the user profile datatype", notes = "", response = UserDatatype.class, nickname = "getUser", tags = ("User"))
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Succssful retrieval of user profiles", response = UserDatatype.class),
            @ApiResponse(code = 500, message = "Internal server error")
    })
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "profile id", required = false, dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "firstname", value = "First name of user", required = false, dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "lastname", value = "Last name of user", required = false, dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "phone", value = "phone number of user", required = false, dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "signup", value = "Sign up date of user, in dd-MM-yyyy forma", required = false, dataType = "java.sql.Date", paramType = "query")
    })
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        RpcLogTemplate logTemplate = new RpcLogTemplate(req.getRemoteHost(),req.getParameter("client"), req.getParameter("clientapp"), Config.localhost, Config.SERVICE_INSTANCE, Config.SERVICE_APP, req.getParameterMap(), new Date().getTime() );
        logger.debug("Received request: GET");
        handleGet(req, resp, logTemplate);
        logTemplate.setResponseTimestamp(new Date().getTime());
        //LoggerService.INSTANCE.addLog(logTemplate);
    }

    private void handleGet(HttpServletRequest request, HttpServletResponse response, RpcLogTemplate logTemplate) throws IOException {
        Gson gson = new Gson();
        String param = null;
        param = request.getParameter("id");
        if(param!= null){
            logger.info("Query by ID received. All other params would be ignored");
            UserDatatype userDatatype = UserDao.INSTANCE.findById(param);
            if(userDatatype == null){
                response.setStatus(HttpServletResponse.SC_OK);
                logger.info("Null object returned");
                return;
            }else{
                response.setStatus(HttpServletResponse.SC_OK);
                PrintWriter printWriter = response.getWriter();
                printWriter.write(gson.toJson(userDatatype, UserDatatype.class));
                printWriter.flush();
                printWriter.close();
            }
        }else{
            Map<String, String> queryString = new HashMap<>();
            //TODO: optimize this
            param = request.getParameter("firstname");
            if(param != null)
                queryString.put("firstname", param);
            param = request.getParameter("lastname");
            if(param != null)
                queryString.put("lastname", param);
            param = request.getParameter("phone");
            if(param != null)
                queryString.put("phone", param);
            param = request.getParameter("signup");
            if(param != null)
                queryString.put("signup", param);
            UserDatatype[] userDatatypes = UserDao.INSTANCE.findByParams(queryString);
            if(userDatatypes == null){
                response.setStatus(HttpServletResponse.SC_OK);
                logger.info("Null object returned");
                return;
            }else{
                response.setStatus(HttpServletResponse.SC_OK);
                PrintWriter printWriter = response.getWriter();
                printWriter.write(gson.toJson(userDatatypes, UserDatatype[].class));
                printWriter.flush();
                printWriter.close();
            }
        }
    }

 }

Bootstrap.java

public class Bootstrap  extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
    super.init(config);

    BeanConfig beanConfig = new BeanConfig();
    beanConfig.setVersion("1.0.2");
    beanConfig.setSchemes(new String[]{"http"});
    beanConfig.setHost("localhost:7000");
    beanConfig.setBasePath("/");
    beanConfig.setResourcePackage("io.swagger.resources");
    beanConfig.setScan(true);
    beanConfig.setPrettyPrint(true);
}

}

所有帮助赞赏 .

EDIT: 快速更新在将initializeAPI方法修改为博客中的原始Servlet类之后(见下文),我能够从http://host:7000/api/swagger.json上的swagger-ui获得一些响应 . 但我似乎swagger无法解析我的servlet注释

http://host:7000/api/swagger.json ===> {"swagger":"2.0","info":{"version":"1.0.0","title":""}}

更新的代码

private static Server initializeApi(Properties properties) {
    logger.info("Initializing user profile server...");
    new UserDao();
    Server server = new Server(Integer.parseInt(properties.getProperty(Config.JETTY_SERVICE_PORT)));
    ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
    servletContextHandler.setContextPath("/");
    server.setHandler(servletContextHandler);
    //Setup APIs
    ServletHolder apiservlet = servletContextHandler.addServlet(ServletContainer.class, "/api/*");
    apiservlet.setInitOrder(1);
    apiservlet.setInitParameter("com.sun.jersey.config.property.packages", "com.api.resources;io.swagger.jaxrs.json;io.swagger.jaxrs.listing");

    apiservlet = servletContextHandler.addServlet(ProfileServlet.class, "/user/*");
    //apiservlet.setInitOrder(1);
    apiservlet.setInitParameter("com.sun.jersey.config.property.packages", "com.api.resources;io.swagger.jaxrs.json;io.swagger.jaxrs.listing");
    logger.info("User profile server initialized.");

    // Setup Swagger servlet
    ServletHolder swaggerServlet = servletContextHandler.addServlet(DefaultJaxrsConfig.class, "/swagger-core");
    swaggerServlet.setInitOrder(2);
    swaggerServlet.setInitParameter("api.version", "1.0.0");

    // Setup Swagger-UI static resources
    String resourceBasePath = Main.class.getResource("/webapp").toExternalForm();
    servletContextHandler.setWelcomeFiles(new String[] {"index.html"});
    servletContextHandler.setResourceBase(resourceBasePath);
    servletContextHandler.addServlet(new ServletHolder(new DefaultServlet()), "/*");

    return server;
}

1 回答

  • 0

    所以感谢Swagger google小组,他们发现我的代码出了什么问题 . 两件事情:

    1.你必须添加你的包(包含servlet作为初始化参数的包到ServletContainer类 . 所以在initializeApi()方法的Main.class下,我改为:

    //Setup APIs
    ServletHolder apiservlet = servletContextHandler.addServlet(ServletContainer.class, "/api/*");
    apiservlet.setInitOrder(1);       apiservlet.setInitParameter("com.sun.jersey.config.property.packages", "com.api.resources;io.swagger.jaxrs.json;io.swagger.jaxrs.listing");
    

    对此:

    //Setup APIs
    ServletHolder apiservlet = servletContextHandler.addServlet(ServletContainer.class, "/api/*");
    apiservlet.setInitOrder(1);
    apiservlet.setInitParameter("com.sun.jersey.config.property.packages", "com.api.resources;io.swagger.jaxrs.json;io.swagger.jaxrs.listing; {path/to/package}");
    

    在我的例子中,{path / to / package}是com.coreservice.servlets

    2.将包名称作为资源添加到Swagger初始化servlet . 在我的项目中,它是Bootstrap.java类 . 所以我的新Bootstrap.java类看起来像这样

    public class Bootstrap  extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    
        BeanConfig beanConfig = new BeanConfig();
        beanConfig.setVersion("1.0.2");
        beanConfig.setSchemes(new String[]{"http"});
        beanConfig.setHost("localhost:7000");
        beanConfig.setBasePath("/");
        beanConfig.setResourcePackage("com.coreservice.servlets");
        beanConfig.setScan(true);
        beanConfig.setPrettyPrint(true);
    }
    

相关问题