On Fri, Sep 26, 2014 at 1:48 AM, Claus Ibsen <[email protected]> wrote:
> 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")); > Good to know. Is it possible to return an object with the REST DSL or only constants? > > > > > 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 Done: https://issues.apache.org/jira/browse/CAMEL-7878
