6

我正在尝试确定是否使用 --

  1. 带有基于 HTTP 的入站端点的 Jersey (JAX-RS)。

  2. 使用基于 HTTP 的入站端点,然后检查 HTTP 标头数据(如 http.method、http.query.params、http.query.string 等)以确定 REST 方法。即非基于泽西的自定义方法来实现 REST。

方法#1的优点

  1. 标准:在 Java 中实现休息服务的基于 JAX-RS 标准的方法。

  2. 记录很容易:生成文档非常简单,因为有许多工具使用 JAX-RS 注释来生成文档。

方法#1的缺点

  1. 如果我们必须在 Mule 中使用 Jersey,那么 Jersey 方法充当有效负载数据的传递。例子-

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public String create(String jsonPayload) {
        logger.debug("Received and added data :" jasonPayload);
        return jsonPayload;
    

    在我们的用例中,我们必须将此数据传递给下一个流,在该流中,它要么插入数据库,要么转发到其他 Web 服务。我们不想在这个类中注入特定于 mule 的代码来从 create 方法中调用其他 Mule 流。我们别无选择,只能将有效负载从该方法中传递出来并在 mule 流中处理。

  2. 在 Jersey 处理 create 方法之后,它会创建一个封装负载的Response对象。如果我们想对有效负载做一些事情,那么我们必须首先从响应对象中提取有效负载。这是不必要的麻烦。

有什么建议、意见、想法吗?

4

3 回答 3

4

根据大卫的反馈。以下是我的实现方式——

REST 类是 TestAPI --

@Path("/test")
public class TestAPI {
private DBOperations dbo;

@POST
@Produces(MediaType.APPLICATION_JSON)
public String create(String jsonPayload) {
    System.out.println("Received and added global attribute :"
            + jsonPayload);
    dbo.create(jsonPayload);
    return jsonPayload;
}

这是界面——

public interface DBOperations {

  public String create(String json);
  public String read(String json);
  public String update(String json);
  public String delete(String json);

} 

这是 mule 流程,它显示了 DBOperations 的每个方法如何映射到 mule 配置中的不同流程。

<flow name="jersey-rest-flow" doc:name="jersey-rest-flow">
    <http:inbound-endpoint exchange-pattern="request-response"
        host="localhost" port="8100" doc:name="HTTP" />
    <logger message="Message Received - #[payload]" level="INFO"
        doc:name="Logger" />
    <jersey:resources doc:name="REST">
        <component class="com.test.rest.TestAPI">
            <binding interface="com.test.DBOperations"
                method="create">
                <vm:outbound-endpoint exchange-pattern="request-response"
                    path="create-data-vm" />
            </binding>
            <binding interface="com.test.DBOperations"
                method="read">
                <vm:outbound-endpoint exchange-pattern="request-response"
                    path="read-data-vm" />
            </binding>
            <binding interface="com.test.DBOperations"
                method="update">
                <vm:outbound-endpoint exchange-pattern="request-response"
                    path="update-data-vm" />
            </binding>
            <binding interface="com.test.DBOperations"
                method="delete">
                <vm:outbound-endpoint exchange-pattern="request-response"
                    path="delete-data-vm" />
            </binding>
        </component>
    </jersey:resources>
</flow>
于 2013-10-17T14:57:35.457 回答
4

还有第三种选择,如果您不想将自己绑定到 Java 代码 - 它是 REST 路由器模块: http:
//mulesoft.github.io/mule-module-rest-router/mule/rest-router-config .html
我认为它更适合您。

更重要的是,几天前我写了一篇关于 Mule 上的 REST 服务的文章,描述了所有这三种方法。包括的例子。它可能对你有帮助:http:
//poznachowski.blogspot.com/2013/10/exposing-restful-interface-with-mule-pt1.html
http://poznachowski.blogspot.com/2013/10/exposing- restful-interface-with-mule-pt2.html

于 2013-10-23T22:45:10.610 回答
2

我们不想在这个类中注入特定于 mule 的代码来从 create 方法中调用其他 Mule 流。我们别无选择,只能将有效负载从该方法中传递出来并在 mule 流中处理。

我不同意这种说法:组件绑定将 Mule-free 自定义接口注入到您自己的类中。这是我推荐您使用的方法:http: //www.mulesoft.org/documentation/display/current/Component+Bindings

于 2013-10-15T00:17:03.867 回答