这是一个影响很小的“问题”,我只是希望了解有关Camel及其工作原理的新知识。
我正在使用骆驼上下文路由来构建springboot服务,尽管它工作正常(到目前为止),但我想将rest路径类型设置为一个类,而不必显式调用包位置,并且而是将类作为bean引用,并使用其id进行调用。
我已经定义了一个camelContext,我拥有其余的,restConfigurations和必要的http方法(get,post,put ...),这是我现在拥有的东西的一个模拟。
我已经将ServiceImpl类注册为Bean,并为其指定了ID Service。在Route中,我可以使用对它的ID的引用来调用Bean,然后选择所需的方法。
<beans xmlns ...>
...
<!-- start services -->
<bean class="com.daniel.rest-project.services.ServiceImpl" id="Service"/>
<!-- end services -->
...
<camelContext id="context" xmlns="http://camel.apache.org/schema/spring">
<rest bindingMode="au <!-- <to id="to-7b30ace2-b26d-4301-8bb0-ef007d566ab3" uri="direct:501"/> -->to" enableCORS="true" id="rest">
...
<post consumes="application/json" id="newTask" produces="application/json" uri="/task" type="com.daniel.rest-project.vo.TaskVO">
<description>New Task Object</description>
<param description="Task Object Body." name="body" required="true" type="body"/>
<to uri="direct:newTask"/>
</post>
...
</rest>
...
<route id="route-task-new">
<from id="from-task-new" uri="
<bean id="to-task-new" method="newTask" ref="Service"/>
</route>
...
</camelContext>
</beans>
现在,我实际上已经实现了约150条路线(项目相当大),我已经厌倦了必须声明其余职位类型,现在它使用的方式与com.daniel.rest-project不太相似.vo .. 有很多类的名称类似,并且由于内部原因,最佳实践稀少,命名约定很奇怪,我需要访问多个软件包,等等。
在XML文件的开头定义我需要的所有对象并随即引用它们时,感觉会更有条理,而不必每次都在其中陈述整个过程,所以,有没有办法我可以像服务一样在开始时定义这些类,并告诉post rest路径使用bean的id,而不必给它整个类的位置?必须有一种方法,而且我敢肯定,过去几周我一直视而不见,看不到它。
这是到目前为止我尝试过的方法之一:
<!-- start classes -->
<bean class="com.daniel.rest-project.vo.TaskVO" id="TaskVO"/>
<!-- end classes -->
然后告诉路径要做类似的事情
<post consumes="application/json" id="newTask" produces="application/json" uri="/task" type="TaskVO">
<description>New Task Object</description>
<param description="Task Object Body." name="body" required="true" type="body"/>
<to uri="direct:newTask"/>
</post>
这导致了以下错误:
Caused by: org.apache.camel.FailedToCreateRouteException: Failed to create route newTask: Route(newTask)[[From[rest:post:/task?routeId=newTask&... because of java.lang.ClassNotFoundException: TaskVO
at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:209)
at org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:1143)
..........
Caused by: org.apache.camel.RuntimeCamelException: java.lang.ClassNotFoundException: TaskvO
at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1830)
at org.apache.camel.impl.DefaultRouteContext.commit(DefaultRouteContext.java:206)
at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:1307)
at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:204)
TaskVO实现了Serializable,并且只有一个空的公共构造函数,然后是所有的getter和setter。