use of io.javalin.plugin.openapi.OpenApiPlugin in project cwms-radar-api by USACE.
the class ApiServlet method init.
@Override
public void init() throws ServletException {
String context = this.getServletContext().getContextPath();
PolicyFactory sanitizer = new HtmlPolicyBuilder().disallowElements("<script>").toFactory();
ObjectMapper om = new ObjectMapper();
JavalinValidation.register(UnitSystem.class, UnitSystem::systemFor);
om.setPropertyNamingStrategy(PropertyNamingStrategies.KEBAB_CASE);
// Needed in Java 8 to properly format java.time classes
om.registerModule(new JavaTimeModule());
AccessManager accessManager = buildAccessManager();
javalin = Javalin.createStandalone(config -> {
config.defaultContentType = "application/json";
config.contextPath = context;
config.registerPlugin(new OpenApiPlugin(getOpenApiOptions()));
config.enableDevLogging();
config.requestLogger((ctx, ms) -> logger.finest(ctx.toString()));
config.accessManager(accessManager);
}).attribute("PolicyFactory", sanitizer).attribute("ObjectMapper", om).before(ctx -> {
ctx.attribute("sanitizer", sanitizer);
ctx.header("X-Content-Type-Options", "nosniff");
ctx.header("X-Frame-Options", "SAMEORIGIN");
ctx.header("X-XSS-Protection", "1; mode=block");
}).exception(FormattingException.class, (fe, ctx) -> {
final RadarError re = new RadarError("Formatting error");
if (fe.getCause() instanceof IOException) {
ctx.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} else {
ctx.status(HttpServletResponse.SC_NOT_IMPLEMENTED);
}
logger.log(Level.SEVERE, fe, () -> re + "for request: " + ctx.fullUrl());
ctx.json(re);
}).exception(UnsupportedOperationException.class, (e, ctx) -> {
final RadarError re = RadarError.notImplemented();
logger.log(Level.WARNING, e, () -> re + "for request: " + ctx.fullUrl());
ctx.status(HttpServletResponse.SC_NOT_IMPLEMENTED).json(re);
}).exception(BadRequestResponse.class, (e, ctx) -> {
RadarError re = new RadarError("Bad Request", e.getDetails());
logger.log(Level.INFO, re.toString(), e);
ctx.status(e.getStatus()).json(re);
}).exception(IllegalArgumentException.class, (e, ctx) -> {
RadarError re = new RadarError("Bad Request");
logger.log(Level.INFO, re.toString(), e);
ctx.status(HttpServletResponse.SC_BAD_REQUEST).json(re);
}).exception(NotFoundException.class, (e, ctx) -> {
RadarError re = new RadarError("Not Found.");
logger.log(Level.INFO, re.toString(), e);
ctx.status(HttpServletResponse.SC_NOT_FOUND).json(re);
}).exception(FieldException.class, (e, ctx) -> {
RadarError re = new RadarError(e.getMessage(), e.getDetails(), true);
ctx.status(HttpServletResponse.SC_BAD_REQUEST).json(re);
}).exception(JsonFieldsException.class, (e, ctx) -> {
RadarError re = new RadarError(e.getMessage(), e.getDetails(), true);
ctx.status(HttpServletResponse.SC_BAD_REQUEST).json(re);
}).exception(Exception.class, (e, ctx) -> {
RadarError errResponse = new RadarError("System Error");
logger.log(Level.WARNING, String.format("error on request[%s]: %s", errResponse.getIncidentIdentifier(), ctx.req.getRequestURI()), e);
ctx.status(500);
ctx.contentType(ContentType.APPLICATION_JSON.toString());
ctx.json(errResponse);
}).routes(this::configureRoutes).javalinServlet();
}
use of io.javalin.plugin.openapi.OpenApiPlugin in project javalin by tipsy.
the class ExampleController method main.
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
OpenApiOptions openApiOptions = new OpenApiOptions(new Info().version("1.0").description("My Application")).activateAnnotationScanningFor("io.javalin.examples").path("/swagger-docs").swagger(new SwaggerOptions("/swagger").title("My Swagger Documentation")).reDoc(new ReDocOptions("/redoc", new RedocOptionsObject.Builder().setHideDownloadButton(true).setTheme(new RedocOptionsTheme.Builder().setSpacingUnit(10).setTypographyOptimizeSpeed(true).build()).build()).title("My ReDoc Documentation"));
Javalin app = Javalin.create(config -> {
config.registerPlugin(new OpenApiPlugin(openApiOptions));
config.jsonMapper(new JavalinJackson(objectMapper));
}).start(7070);
app.post("/users", ExampleController::create);
}
use of io.javalin.plugin.openapi.OpenApiPlugin in project Jexxa by repplix.
the class OpenAPIConvention method initOpenAPI.
private void initOpenAPI() {
if (properties.containsKey(JEXXA_REST_OPEN_API_PATH)) {
var applicationInfo = new Info().version(properties.getProperty(JEXXA_CONTEXT_VERSION, "1.0")).description("Auto generated OpenAPI for " + properties.getProperty(JEXXA_CONTEXT_NAME, "Unknown Context")).title(properties.getProperty(JEXXA_CONTEXT_NAME, "Unknown Context"));
openApiOptions = new OpenApiOptions(applicationInfo).path("/" + properties.getProperty(JEXXA_REST_OPEN_API_PATH));
// Show all fields of an ValueObject
openApiOptions.getJacksonMapper().setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
javalinConfig.registerPlugin(new OpenApiPlugin(openApiOptions));
javalinConfig.enableCorsForAllOrigins();
openApiOptions.defaultDocumentation(doc -> {
doc.json(String.valueOf(HTTP_BAD_REQUEST), BadRequestResponse.class);
doc.json(String.valueOf(HTTP_BAD_REQUEST), BadRequestResponse.class);
});
}
}
use of io.javalin.plugin.openapi.OpenApiPlugin in project cineast by vitrivr.
the class APIEndpoint method dispatchService.
/**
* Dispatches a new Jetty {@link Javalin} (HTTP endpoint). The method takes care of all the necessary setup.
*
* @param secure If true, the new Service will be setup as secure with TLS enabled.
* @return {@link Javalin}
*/
public Javalin dispatchService(boolean secure) {
final APIConfig config = Config.sharedConfig().getApi();
final int port = this.validateAndNormalizePort(secure, config);
final Javalin service = Javalin.create(serviceConfig -> {
/* Default return mime */
serviceConfig.defaultContentType = "application/json";
/* Prefer 405 over 404 to not expose information */
serviceConfig.prefer405over404 = true;
/* Configure server (TLS, thread pool, etc.) */
serviceConfig.enableCorsForAllOrigins();
/* Configuration of the actual server */
serviceConfig.server(() -> {
QueuedThreadPool threadPool = new QueuedThreadPool(config.getThreadPoolSize(), 2, 30000);
Server server = new Server(threadPool);
ServerConnector connector;
if (secure) {
/* Setup TLS if secure flag was set. */
SslContextFactory sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath(config.getKeystore());
sslContextFactory.setKeyStorePassword(config.getKeystorePassword());
connector = new ServerConnector(server, sslContextFactory);
} else {
connector = new ServerConnector(server);
}
if (port > 0) {
connector.setPort(port);
}
server.setConnectors(new Connector[] { connector });
return server;
});
/* Configure OpenAPI/Swagger doc */
if (config.getEnableLiveDoc()) {
this.openApi = new OpenApiPlugin(OpenApiCompatHelper.getJavalinOpenApiOptions(config));
serviceConfig.registerPlugin(this.openApi);
/* Enable webjars to serve Swagger-UI */
serviceConfig.enableWebjars();
}
/* Serve the UI if requested statically*/
if (config.getServeUI()) {
LOGGER.info("UI serving is enabled");
/* Add css, js and other static files */
serviceConfig.addStaticFiles(config.getUiLocation(), Location.EXTERNAL);
/* Add index.html - the ui's front page as default route. Anything reroutes to there */
serviceConfig.addSinglePageRoot("/", config.getUiLocation() + "/index.html", Location.EXTERNAL);
}
});
/* Enable WebSocket (if configured). */
if (config.getEnableWebsocket()) {
LOGGER.info("Starting WS API");
this.webSocketApi = new WebsocketAPI();
service.ws(String.format("%s/websocket", namespace()), handler -> {
handler.onConnect(ctx -> webSocketApi.connected(ctx.session));
handler.onClose(ctx -> webSocketApi.closed(ctx.session, ctx.status(), ctx.reason()));
handler.onError(ctx -> webSocketApi.onWebSocketException(ctx.session, ctx.error()));
handler.onMessage(ctx -> webSocketApi.message(ctx.session, ctx.message()));
});
}
/* Setup HTTP/RESTful connection (if configured). */
if (config.getEnableRest() || config.getEnableRestSecure()) {
LOGGER.info("Starting REST API");
this.restHandlers.forEach(handler -> registerRestHandler(service, handler));
this.registerServingRoutes(service, config);
}
/* Register a general exception handler. TODO: Add fine grained exception handling. */
service.exception(Exception.class, (ex, ctx) -> {
ex.printStackTrace();
LOGGER.error(ex);
});
/* Start javalin */
try {
if (port > 0) {
service.start(port);
} else {
service.start();
}
} catch (Exception ex) {
LOGGER.log(Level.FATAL, "Failed to start HTTP endpoint due to an exception. Cineast will shut down now!", ex);
System.exit(100);
}
return service;
}
use of io.javalin.plugin.openapi.OpenApiPlugin in project Jexxa by jexxa-projects.
the class OpenAPIConvention method initOpenAPI.
private void initOpenAPI() {
if (properties.containsKey(JEXXA_REST_OPEN_API_PATH)) {
var applicationInfo = new Info().version(properties.getProperty(JEXXA_CONTEXT_VERSION, "1.0")).description("Auto generated OpenAPI for " + properties.getProperty(JEXXA_CONTEXT_NAME, "Unknown Context")).title(properties.getProperty(JEXXA_CONTEXT_NAME, "Unknown Context"));
openApiOptions = new OpenApiOptions(applicationInfo).path("/" + properties.getProperty(JEXXA_REST_OPEN_API_PATH));
// Show all fields of an ValueObject
openApiOptions.getJacksonMapper().setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
javalinConfig.registerPlugin(new OpenApiPlugin(openApiOptions));
javalinConfig.enableCorsForAllOrigins();
openApiOptions.defaultDocumentation(doc -> {
doc.json(String.valueOf(HTTP_BAD_REQUEST), BadRequestResponse.class);
doc.json(String.valueOf(HTTP_BAD_REQUEST), BadRequestResponse.class);
});
}
}
Aggregations