我一直在尝试使用招摇来记录我的jaxrs-resteasy服务。我想在嵌入式jetty服务器设置中以编程方式配置它。这是我的资源,服务器和应用程序类。
我可以访问http://127.0.0.1:9091/rest/hello
并验证我的其余服务是否正常工作..但是当我尝试访问http://127.0.0.1:9091/rest/api-docs
时,我无法使其正常工作,但看到404找不到。
有人可以指出我在配置Swagger时可能出错的地方。
资源文件
@Api(value = "/", description = "Index")
@Path("/")
public class Index {
@GET
@ApiOperation(
value = "call Index",
response = Response.class,
responseContainer = "Object"
)
@Produces("text/html")
public Response index() throws URISyntaxException {
File f = new File(System.getProperty("user.dir")+"/index.html");
String mt = new MimetypesFileTypeMap().getContentType(f);
return Response.ok(f, mt).build();
}
@GET
@Path("/hello")
@ApiOperation(
value = "hello Get",
response = Response.class,
responseContainer = "Object"
)
public Response helloGet() {
return Response.status(200).entity("HTTP GET method called").build();
}
}
服务器
public class JettyServer {
public static void main(String[] args) throws IOException {
Server server = new Server(9091);
final HandlerList handlers = new HandlerList();
ServletHolder h = new ServletHolder(new HttpServletDispatcher());
h.setInitParameter("javax.ws.rs.Application", "com.all.MyServices");
// h.setInitOrder(1);
ServletContextHandler restContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
restContextHandler.setContextPath("/rest");
restContextHandler.addServlet(h, "/*");
handlers.addHandler(restContextHandler);
server.setHandler(handlers);
try {
server.start();
server.join();
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务档案
public class MyServices extends Application {
private static Set<Index> services = new HashSet<>();
public MyServices() {
System.out.println( "Initializing Swagger BeanConfig" );
BeanConfig beanConfig = new BeanConfig();
beanConfig.setVersion("1.0");
beanConfig.setResourcePackage( Index.class.getPackage().getName() );
beanConfig.setBasePath( "http://localhost:9091/api" );
beanConfig.setDescription( "My RESTful services" );
beanConfig.setTitle( "My RESTful API" );
beanConfig.setScan( true );
services.add(new Index());
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Set getSingletons() {
return services;
}
@SuppressWarnings("rawtypes")
public static Set getServices() {
return services;
}
}
答案 0 :(得分:0)
我知道这是一个老问题,但这可能对某人有所帮助,所以这里就是。
我不确定您使用的是什么版本的版本,但这与我在Swagger的几个不同版本中不止一次遇到过的问题相符。我注意到的一件事是,您无处注册Swagger附带的ApiListingResourceJSON
,ApiDeclarationProvider
或ResourceListingProvider
类。这些类是提供/api-docs/
资源所必需的。
此外,典型配置对我不起作用。使用BeanConfig
只会产生一个空的JSON Swagger元素。如果发生这种情况,我通过创建自定义配置解决了这个问题。
public class CustomSwaggerConfig extends HttpServlet {
public static final String PACKAGE = "com.shorecg.eureka";
@Override
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
ConfigFactory.setConfig(new WebXMLReader(servletConfig));
ReflectiveJaxrsScanner scanner = new ReflectiveJaxrsScanner();
scanner.setResourcePackage(PACKAGE);
ScannerFactory.setScanner(scanner);
ClassReaders.setReader(new DefaultJaxrsApiReader());
}
class ReflectiveJaxrsScanner implements JaxrsScanner {
private String resourcePackage;
public String getResourcePackage() {
return resourcePackage;
}
public ReflectiveJaxrsScanner setResourcePackage(String resourcePackage) {
this.resourcePackage = resourcePackage;
return this;
}
@Override
public List<Class<?>> classes() {
Reflections reflections = new Reflections(resourcePackage);
Set<Class<?>> clsses = reflections.getTypesAnnotatedWith(Api.class);
return JavaConversions.asScalaSet(clsses).toList();
}
@Override
public List<Class<?>> classesFromContext(Application aplctn, ServletConfig sc) {
return classes();
}
}
}
这不是一个完美的解决方案。例如,如果您有未注册的资源,如果您使用此自定义swagger配置,它们仍将显示在Swagger中。然而,它确实让我觉得招摇真的有效。希望这会有所帮助。