2015-01-22 2 views
5

Поскольку я prety много нового для верблюда Apache и особенно Rest DSL, я подумал о попытке попробовать образец DSL для отдыха.Ошибка при создании службы отдыха с использованием apache camel

Так я создал верблюда-config.xml как:

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:camel="http://camel.apache.org/schema/spring" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> 

    <!-- use camel-metrics route policy to gather metrics for all routes --> 
    <!-- bean id="metricsRoutePolicyFactory" class="org.apache.camel.component.metrics.routepolicy.MetricsRoutePolicyFactory"/--> 

    <!-- a rest service which uses binding to/from pojos --> 
    <bean id="userRoutes" class="org.apache.camel.example.rest.UserRouteBuilder"/> 

    <!-- a bean for user services --> 
    <bean id="userService" class="org.apache.camel.example.rest.UserService"/> 

    <camelContext id="myCamel" xmlns="http://camel.apache.org/schema/spring"> 
    <routeBuilder ref="userRoutes"/> 
    </camelContext> 

</beans> 

и мой класс маршрута:

package org.apache.camel.example.rest; 

import org.apache.camel.builder.RouteBuilder; 

/** 
* Define REST services using the Camel REST DSL 
*/ 
public class UserRouteBuilder extends RouteBuilder { 

    public void configure() throws Exception { 
     rest("/say").get("/hello").to("direct:hello").get("/bye") 
       .consumes("application/json").to("direct:bye").post("/bye") 
       .to("mock:update"); 
     from("direct:hello").transform().constant("Hello World"); 
     from("direct:bye").transform().constant("Bye World"); 
    } 

} 

и мой web.xml является:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
    <display-name>My Camel Rest Application</display-name> 

    <!-- location of Camel Spring xml files --> 
    <context-param> 
    <param-name>contextConfigLocation</param-name> 

    <!-- to use Java DSL --> 
    <param-value>classpath:camel-config.xml</param-value> 

    <!-- to use XML DSL, then enable me, and disable Java DSL above 
    <param-value>classpath:camel-config-xml.xml</param-value> 
    --> 
    </context-param> 

    <!-- the listener that kick-starts Spring --> 
    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <!-- to setup Camel Servlet --> 
    <servlet> 
    <display-name>Camel Http Transport Servlet</display-name> 
    <servlet-name>CamelServlet</servlet-name> 
    <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <!-- START SNIPPET: e1 --> 
    <!-- to setup Camel Swagger api servlet --> 
    <servlet> 
    <servlet-name>ApiDeclarationServlet</servlet-name> 
    <servlet-class>org.apache.camel.component.swagger.DefaultCamelSwaggerServlet</servlet-class> 
    <init-param> 
     <!-- we specify the base.path using relative notation, that means the actual path will be calculated at runtime as 
      http://server:port/contextpath/rest --> 
     <param-name>base.path</param-name> 
     <param-value>rest</param-value> 
    </init-param> 
    <init-param> 
     <!-- we specify the api.path using relative notation, that means the actual path will be calculated at runtime as 
      http://server:port/contextpath/api-docs --> 
     <param-name>api.path</param-name> 
     <param-value>api-docs</param-value> 
    </init-param> 
    <init-param> 
     <param-name>api.version</param-name> 
     <param-value>1.2.3</param-value> 
    </init-param> 
    <init-param> 
     <param-name>api.title</param-name> 
     <param-value>User Services</param-value> 
    </init-param> 
    <init-param> 
     <param-name>api.description</param-name> 
     <param-value>Camel Rest Example with Swagger that provides an User REST service</param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
    </servlet> 

    <!-- swagger api declaration --> 
    <servlet-mapping> 
    <servlet-name>ApiDeclarationServlet</servlet-name> 
    <url-pattern>/api-docs/*</url-pattern> 
    </servlet-mapping> 
    <!-- END SNIPPET: e1 --> 

    <!-- define that url path for the Camel Servlet to use --> 
    <servlet-mapping> 
    <servlet-name>CamelServlet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 

    <!-- START SNIPPET: e2 --> 
    <!-- enable CORS filter so people can use swagger ui to browse and test the apis --> 
    <filter> 
    <filter-name>RestSwaggerCorsFilter</filter-name> 
    <filter-class>org.apache.camel.component.swagger.RestSwaggerCorsFilter</filter-class> 
    </filter> 

    <filter-mapping> 
    <filter-name>RestSwaggerCorsFilter</filter-name> 
    <url-pattern>/api-docs/*</url-pattern> 
    <url-pattern>/rest/*</url-pattern> 
    </filter-mapping> 
    <!-- END SNIPPET: e2 --> 

    <welcome-file-list> 
     <welcome-file>home.html</welcome-file> 
    </welcome-file-list> 

</web-app> 

сейчас Я создал военный файл моего restProject, и я развернул его на tomcat. Предоставил все необходимые банки в папке lib tomcat. Я использую верблюд 2.14.

Теперь, когда я начинаю мой кот, во время запуска я получаю сообщение об ошибке, как:

SEVERE: Context initialization failed 
org.apache.camel.RuntimeCamelException: java.lang.IllegalStateException: Cannot find RestConsumerFactory in Registry or 
as a Component to use 
     at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1364) 
     at org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:122) 
     at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:327) 
     at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMult 
icaster.java:96) 
     at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:3 
34) 
     at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java: 
948) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
     at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389 
) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4791) 
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5285) 
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) 
     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 
     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:618) 
     at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1100) 
     at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1618) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
     at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.IllegalStateException: Cannot find RestConsumerFactory in Registry or as a Component to use 
     at org.apache.camel.component.rest.RestEndpoint.createConsumer(RestEndpoint.java:238) 
     at org.apache.camel.impl.EventDrivenConsumerRoute.addServices(EventDrivenConsumerRoute.java:65) 
     at org.apache.camel.impl.DefaultRoute.onStartingServices(DefaultRoute.java:80) 
     at org.apache.camel.impl.RouteService.warmUp(RouteService.java:134) 
     at org.apache.camel.impl.DefaultCamelContext.doWarmUpRoutes(DefaultCamelContext.java:2379) 
     at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:2309) 
     at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:2091) 
     at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:1951) 
     at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:1777) 
     at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) 
     at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:1745) 
     at org.apache.camel.spring.SpringCamelContext.maybeStart(SpringCamelContext.java:254) 
     at org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:120) 
     ... 22 more 

Я пытаюсь выяснить, в течение последних двух дней, почему я получаю эту ошибку. Действительно с нетерпением жду ваших решений. Спасибо заранее.

ответ

9

Вам нужна дополнительная конфигурация для остальных DSL. 4, как описано в разделе http://camel.apache.org/rest-dsl.html, поддерживают поддержку DSL. Посмотрите на раздел [Компоненты, поддерживающие Rest DSL]. Для получения конфигурации см. Раздел [Конфигурирование остальной DSL]

Что вам нужно, это еще 2 дополнения.

1) В вашем построителе маршрутов остальная часть конфигурации. Для сервлет-компонента, который может быть restConfiguration().component("servlet") -> здесь больше возможностей.

Найти полную конфигурацию в этом example

2) Добавить зависимость в pom.xml.

<dependency> 
    <groupId>org.apache.camel</groupId> 
    <artifactId>camel-servlet</artifactId> 
</dependency> 

Для искровых остальных конфигураций, посмотри на коде here

Смежные вопросы