Hi
On Thu, Sep 25, 2014 at 11:23 PM, Matt Raible <[email protected]> wrote:
> Hey all,
>
> I'm starting to develop a new application and I'm researching using Camel's
> REST DSL vs. Spring Boot and it's REST support. The last application I wrote
> used Apache Camel + Spring Boot, but I only used the external properties
> support from Boot. For this new application, I have a skeleton of the
> previous project. The new project needs to do REST (XML-based). Looking at a
> HelloWorld example in Spring MVC vs. Camel, I'm leaning towards using Spring
> MVC.
>
> Camel
> ----
> @Component
> public class HelloWorldRoute extends RouteBuilder {
> @Override
> public void configure() throws Exception {
> // servlet is configured in Application.java
>
> restConfiguration().component("servlet").bindingMode(RestBindingMode.json);
>
> rest("/say")
> .get("/hello")
> .to("direct:talk");
> from("direct:talk")
> .process(exchange -> {
> HelloWorld hw =
> HelloWorld.builder().message("Howdy World!").build();
> exchange.getIn().setBody(hw);
> });
> }
> }
>
Now its only a hello world, but you can embed the route in the rest
dsl directly, if you want, so its shorter
rest("/say")
.get("/hello")
.route().transform(constant("Hello World"));
>
> Spring MVC
> ----
> @RestController
> @Api("Hello")
> public class HelloWorldController {
>
> @RequestMapping(value = "/api/hello", method = RequestMethod.GET)
> public HelloWorld sayHello() {
> return HelloWorld.builder().message("Hello World").build();
> }
> }
>
>
> I was able to get Swagger working for both services, albeit with different
> endpoints. One issue I found is that the "base.path" has to be configured or
> calling the methods by clicking on buttons in Swagger UI doesn't work. With
> Spring Boot, I'm able to configure Swagger with the following:
>
> @Configuration
> @EnableSwagger
> public class SwaggerConfig implements EnvironmentAware {
> public static final String DEFAULT_INCLUDE_PATTERN = "/api/.*";
>
> private RelaxedPropertyResolver propertyResolver;
>
> @Override
> public void setEnvironment(Environment environment) {
> this.propertyResolver = new
> RelaxedPropertyResolver(environment, "swagger.");
> }
>
> /**
> * Swagger Spring MVC configuration
> */
> @Bean
> public SwaggerSpringMvcPlugin
> swaggerSpringMvcPlugin(SpringSwaggerConfig springSwaggerConfig) {
> return new SwaggerSpringMvcPlugin(springSwaggerConfig)
> .apiInfo(apiInfo())
> .genericModelSubstitutes(ResponseEntity.class)
> .includePatterns(DEFAULT_INCLUDE_PATTERN);
> }
>
> /**
> * API Info as it appears on the swagger-ui page
> */
> private ApiInfo apiInfo() {
> return new ApiInfo(
> propertyResolver.getProperty("title"),
> propertyResolver.getProperty("description"),
>
> propertyResolver.getProperty("termsOfServiceUrl"),
> propertyResolver.getProperty("contact"),
> propertyResolver.getProperty("license"),
> propertyResolver.getProperty("licenseUrl"));
> }
> }
>
> With Camel, it's a bit less code, but if I don't override the "base.path", it
> defaults to localhost:8080. The Spring MVC Swagger implementation figures out
> the correct base path on its own.
>
> /**
> * Swagger Camel Configuration
> */
> @Bean
> public ServletRegistrationBean swaggerServlet() {
> ServletRegistrationBean swagger = new
> ServletRegistrationBean(new SpringRestSwaggerApiDeclarationServlet(),
> "/swagger/*");
> Map<String, String> params = new HashMap<>();
> params.put("base.path", "https://localhost:8443/rest");
> params.put("api.title",
> propertyResolver.getProperty("title"));
> params.put("api.description",
> propertyResolver.getProperty("description"));
> params.put("api.termsOfServiceUrl",
> propertyResolver.getProperty("termsOfServiceUrl"));
> params.put("api.version",
> propertyResolver.getProperty("version"));
> params.put("api.license",
> propertyResolver.getProperty("license"));
> params.put("api.licenseUrl",
> propertyResolver.getProperty("licenseUrl"));
> swagger.setInitParameters(params);
> return swagger;
> }
>
> Is it possible to improve the SpringRestSwaggerApiDeclarationServlet so it
> gets the path from CamelServlet and it doesn't have to be hardcoded?
>
Yeah sure we can look into that, and also make the java configuration
easier so you can use a builder instead of the map etc. Feel free to
log a JIRA ticket in the issue tracker
http://camel.apache.org/support
> Thanks,
>
> Matt
--
Claus Ibsen
-----------------
Red Hat, Inc.
Email: [email protected]
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
hawtio: http://hawt.io/
fabric8: http://fabric8.io/