正如另一个答案所说,cxf:rsServer
主要用于通过 Camel 路线进行处理,如jaxrs:server
请求的处理是由经典控制器完成的。
例如:
- 经典 JAXRS 服务器:
您将声明一个经典的 Bean Rest(控制器)并在其中注入一个 Service。
XML 配置示例(摘录):
<jaxrs:server id="deviceServiceSvcV1" address="/device/v1">
<jaxrs:serviceBeans>
<ref component-id="deviceServiceRest" />
</jaxrs:serviceBeans>
<!-- and other providers, interceptors, etc... here -->
</jaxrs:server>
<!-- Service bean -->
<bean id="deviceServiceRest" class="org.mycomp.device.rest.v1.ws.api.DeviceServiceRest">
<property name="deviceService" ref="deviceService" />
</bean>
Controller 类将以经典方式处理请求/响应(例如调用注入的服务)。
- 骆驼路线
cxf:rsServer
XML 配置示例(摘录):
<cxf:rsServer id="rsServer" address="/device/v1"
serviceClass="org.mycomp.device.rest.v1.ws.api.DeviceServiceRest">
<cxf:properties>
<!-- whatever here -->
</cxf:properties>
<!-- and other interceptors, etc... here -->
</cxf:rsServer>
以及在课堂上:
@Produces({ MediaType.APPLICATION_XML })
@Path("/")
public class DeviceServiceRest {
@GET
public Response listDevicess(
@QueryParam("model") String model,
@QueryParam("sid") String sid,
) {
return null; // never used
}
@GET
@Path("{id}")
public Response getDeviceById(
@PathParam("id") String id,
@QueryParam("model") String model,
@QueryParam("sid") String sid
){
return null; // never used
}
}
REST 控制器有空方法(返回 null),但我认为最新的camel-cxf
现在支持Interface
这比让方法返回更优雅null
。
现在,请求处理可以通过 Camel Route 来实现,如下所示:
from("cxfrs:bean:rsServer?synchronous=true")
.routeId("cxf-device-rest-v1")
.process( new CheckAuthenticationProcessor())
.choice()
.when(header("operationName").isEqualTo("listDevice"))
.setHeader("backenOperation").constant("list")
.setHeader("backendResource").constant("device")
.endChoice()
.when(header("operationName").isEqualTo("getDeviceById"))
.setHeader("backenOperation").constant("retrieve")
.setHeader("backendResource").constant("device")
.endChoice()
.end()
.bean("requestProcessor")
.to(InOut, backendEndpoint)
.process(checkResponseStatusCode())
.bean(new HttpResponseProcessor())
;
您还可以根据需要从路由中控制请求/响应处理。
这是两种不同类型的 REST API(服务器端)实现,但在我看来,这有点老派,因为像 spring-boot 这样的现代框架不需要任何这些。
我发现第二种方式有点太过分了,因为我喜欢 Camel 进行集成,但将其用于 REST API 可能会受到讨论。
我看到的一个用例是用于异步处理的 HTTP REST Web 服务,服务响应 202 Accepted 以及 Camel Route 以异步模式集成请求,特别是当可以轻松使用特定的 Camel 组件而不是复杂的组件时类(或 EIP 模式的任何需要)。