Действительно, расширение Restlet RAML не предназначено для использования в приложении JAXRS. Тем не менее, вы можете определить ресурс, который предоставляет контент RAML на основе классов ApplicationIntrospector
Restlet и RamlEmitter
парсера RAML, как описано ниже:
public class RamlResource {
private Definition definition;
@Path("/raml")
@GET
public String getRaml() {
return new RamlEmitter().dump(RamlTranslator
.getRaml(getDefinition()));
}
private synchronized Definition getDefinition() {
if (definition == null) {
synchronized (RamlResource.class) {
definition = ApplicationIntrospector.getDefinition(
Application.getCurrent(),
new Reference("/"), null, false);
}
}
return definition;
}
}
Так работает RAML-расширение Restlet. Вы также можете использовать такой подход для Swagger, но будьте осторожны, поскольку для Swagger 1.2 требуется несколько ресурсов (основной и несколько дополнительных для каждой категории). Это больше не относится к Swagger 2.
Вы можете заметить, что в расширении org.restlet.ext.swagger
есть поддержка JAX-RS для Swagger.
----- Отредактировано
Возможно, вы можете попробовать этот класс, который соответствует порту класса JaxRsApplicationSwaggerSpecificationRestlet
на RAML. Он основан на классе JaxRsIntrospector
, который кажется актуальным для приложения JAX-RS:
public class JaxRsApplicationRamlSpecificationRestlet extends Restlet {
private Application application;
private String basePath;
private Reference baseRef;
private Definition definition;
public JaxRsApplicationRamlSpecificationRestlet(Application application) {
this(null, application);
}
public JaxRsApplicationRamlSpecificationRestlet(Context context, Application application) {
super(context);
this.application = application;
}
public void attach(Router router) {
attach(router, "/api-docs");
}
public void attach(Router router, String path) {
router.attach(path, this);
router.attach(path + "/{resource}", this);
}
public Representation getApiDeclaration() {
Raml raml = RamlTranslator.getRaml(
getDefinition());
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
try {
return new StringRepresentation(
mapper.writeValueAsString(raml),
MediaType.APPLICATION_YAML);
} catch (Exception ex) {
return new StringRepresentation("error");
}
}
public String getBasePath() {
return basePath;
}
private synchronized Definition getDefinition() {
if (definition == null) {
synchronized (JaxRsApplicationRamlSpecificationRestlet.class) {
definition = JaxRsIntrospector.getDefinition(application,
baseRef, false);
}
}
return definition;
}
@Override
public void handle(Request request, Response response) {
super.handle(request, response);
if (Method.GET.equals(request.getMethod())) {
response.setEntity(getApiDeclaration());
} else {
response.setStatus(Status.CLIENT_ERROR_METHOD_NOT_ALLOWED);
}
}
public void setApiInboundRoot(Application application) {
this.application = application;
}
public void setApplication(Application application) {
this.application = application;
}
public void setBasePath(String basePath) {
this.basePath = basePath;
// Process basepath and check validity
this.baseRef = basePath != null ? new Reference(basePath) : null;
}
}
Вы можете использовать этот класс следующим образом:
JaxRsApplication application
= new JaxRsApplication(component.getContext());
MyApplication app = new MyApplication();
application.add(app);
new JaxRsApplicationRamlSpecificationRestlet(app);
(...)
Нет необходимости в специальном ресурсе. Обратите внимание, что этот код немного экспериментальный ;-) Я мог бы предложить его обратно для вклада в расширение raml в Restlet...
Надеюсь, это поможет вам, Тьерри.
person
Thierry Templier
schedule
13.04.2015