【问题标题】:AMF/JAX-RS questions (some general, some Enunciate-specific)AMF/JAX-RS 问题(一些一般性问题,一些特定于 Enunciate 的问题)
【发布时间】:2011-11-10 05:55:18
【问题描述】:

如果其中有任何错误,请原谅我 - 我对 Java 完全陌生。我的任务是为即将推出的 Facebook 游戏设置客户端/服务器架构。在服务器端,我有:

  • Java
  • 雄猫
  • 轻松休息
  • BlazeDS
  • 发声

全部与 Maven 结合在一起。我可以用 @Path() 注释 RESTful 端点,当我在浏览器中点击它们时,它们会吐出在 AMF 中序列化的对象。到现在为止还挺好。现在我需要在客户端/Flex 端使用这些端点。 Enunciate 已经为我在 Java 中使用 @XmlRootElement 注释的类型生成了 AS 文件,我可以在我的 AS3 代码中使用这些类型。问题是在 AS3 中访问 REST 端点非常难看。它看起来像这样:

function resourceRetrieved(event:Event):void {
  var stream:URLStream = URLStream( event.target );
  var resource:SomeJavaClass = ( stream.readObject() as SomeJavaClass );
  lblResult.text = resource.message; 
}

var request:URLRequest = new URLRequest("http://localhost:8080/rest/somefunc");
request.method = URLRequestMethod.GET;

var variables:URLVariables = new URLVariables();
variables.message = "This is my test string!";
request.data = variables;

var resourceStream:URLStream = new URLStream();
resourceStream.addEventListener("complete", resourceRetrieved)
resourceStream.load(request);

丑陋 - 我必须手写这个才能获得强类型的好处。然而!我在挖掘源代码时注意到,如果使用@WebService 和@WebMethod 标签而不是@Path,我的服务类的精彩强类型AS3 包装器将由Enunciate 生成,以及相应的AS3 事件。它还会生成正确的 services-config.xml!然后用法变成这样:

function onSomeFuncEvent(event:SomeJavaServiceEvent):void {
  lblResult.text = event.result;
}

var service:SomeJavaService = new SomeJavaService();
service.addEventListener( SomeJavaServiceEvent.SomeFuncEvent, onSomeFuncEvent );
service.someFunc("This is my test string!");

如您所见,生成代码的使用者不需要知道端点在哪里,从事件返回什么类型等。我想走这条路线,因为我相信它会更容易维护.这让我想到了我的问题:

  1. 为什么只为@WebService 和@WebMethod(互联网告诉我是JAX-WS)而不是@Path 生成美妙的Service 和ServiceEvent 对象?是尚未完成的工作,还是鉴于 JAX-RS 和 JAX-WS 之间的规范差异而无法完成的工作? (我看到as3-endpoint.fmt具体只适用于代码中的@WebService)
  2. 我想在这里使用 REST 有错吗?我的 CTO 推荐了 Java/Tomcat/RestEasy/BlazeDS 堆栈,但在我看来(在摆弄了一两天之后)BlazeDS/Flex 与 REST 相处得不太好。
  3. 是否有我应该考虑的 Java->AMF->Flex 堆栈?

感谢您抽出宝贵时间,如果这些是明显的问题,我再次感到抱歉。我的背景是游戏开发,而不是网络开发。

【问题讨论】:

    标签: java apache-flex jax-ws jax-rs enunciate


    【解决方案1】:

    为什么只为@WebService 和@WebMethod(互联网告诉我是JAX-WS)而不是@Path 生成美妙的Service 和ServiceEvent 对象?是尚未完成的工作,还是鉴于 JAX-RS 和 JAX-WS 之间的规范差异而无法完成的工作? (我看到as3-endpoint.fmt具体只适用于代码中的@WebService)

    这是可以完成的工作,但还没有完成。还有一个悬而未决的问题是是否应该完成。

    REST 很难。面向服务的 API(例如 SOAP、AMF)对开发人员来说更加直观。 JAX-RS 使创建 REST API 变得很容易,但代价是给开发人员更多的绳索让自己上吊。更具体地说,JAX-RS 使创建基于 HTTP 的 API 变得容易,但仅仅因为它使用 HTTP 并不能使其成为 REST。为了更好地理解我在说什么,我建议 Martin Fowler 关于理查森成熟度模型的文章:

    http://martinfowler.com/articles/richardsonMaturityModel.html

    因此,REST 不仅仅是发出 HTTP 请求和解析响应。通过扩展,创建调用 JAX-RS 资源(即@Path)的客户端服务不仅仅是将 HTTP 调用包装在方便的 AMF 服务类中。缓存、分层、HATEOAS 等等等等,都会发挥作用,并且必须“隐藏”在 Enunciate 生成的客户端服务中。

    我想在这里使用 REST 有错吗?

    您没有,但您似乎低估了“使用 REST”的含义。所以 IMO,你有两个选择:

    1. 只需使用 JAX-WS 创建一个面向服务的 API。
    2. 去了解 REST 到底是什么,以及如何将它真正应用到您的问题空间中。并且不要低估其中的复杂性。 REST 很难。

    Java/Tomcat/RestEasy/BlazeDS 堆栈是我的 CTO 推荐的,但在我看来(在摆弄了一两天之后)BlazeDS/Flex 与 REST 相处得不太好。

    也许吧。至少有一件事是肯定的:BlazeDS/AMF 的设计者在设计他们的堆栈时并没有考虑 REST。

    是否有我应该考虑的 Java->AMF->Flex 堆栈?

    BlazeDS 和 GraniteDS 是我能想到的仅有的两个。它们都是很好的 IMO,所以请自行选择。

    【讨论】:

    • 感谢您提供信息丰富的回复。在您回复之前,我进行了更多挖掘,并决定将 JAX-WS 与 AMF 结合使用是更好的途径。我很高兴你的建议是一样的。一切都很好。
    • BlazeDS 是为 RPC 而不是 REST 设计的。在 Flex 中,您可以使用 REST 服务和基于 WSDL 的服务,而无需中间件解决方案,例如 BlazeDS 或 GraniteDS。如果您想使用 AMF 序列化服务调用的结果和参数,您将需要在服务器端使用 BlazeDS - 毕竟 AMF 是最优化的序列化协议之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2011-08-20
    • 2016-10-31
    相关资源
    最近更新 更多