我最近跟着这个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);
}
}
所有帮助表示赞赏。
编辑:快速更新。在将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;
}
答案 0 :(得分: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);
}