AMF / JAX-RS问题(一些通用,一些特定于Enunciate)

时间:2011-11-10 05:55:18

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

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

  • Java
  • Tomcat的
  • RestEasy的
  • 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(Internet告诉我是JAX-WS)生成了很棒的Service和ServiceEvent对象,而不是@Path?考虑到JAX-RS和JAX-WS之间的规范差异,它是否尚未完成,或者无法完成的工作? (我看到as3-endpoint.fmt特别仅在代码中应用于@WebService)
  2. 我想在这里使用REST是错的吗?我的CTO推荐使用Java / Tomcat / RestEasy / BlazeDS堆栈,但在我看来(在摆弄了一两天之后)BlazeDS / Flex与REST相处并不好。
  3. 我应该考虑使用Java-> AMF-> Flex堆栈?
  4. 感谢您的时间,如果这些是明显的问题,我很抱歉。我的背景是游戏开发,而不是网络开发。

1 个答案:

答案 0 :(得分:0)

  

为什么只为@WebService和@WebMethod(Internet告诉我是JAX-WS)生成了很棒的Service和ServiceEvent对象,而不是@Path?考虑到JAX-RS和JAX-WS之间的规范差异,它是否尚未完成,或者无法完成的工作? (我看到as3-endpoint.fmt特别只在代码中应用于@WebService)

可以完成的工作,但尚未完成。还有一个未解决的问题是是否应该完成。

REST很难。面向服务的API(例如SOAP,AMF)对开发人员来说更直观。 JAX-RS使创建REST API变得容易,但代价是为开发人员提供了更多的依赖。更具体地说,JAX-RS可以轻松创建基于HTTP的API,但仅仅因为它使用HTTP并不能使其成为REST。为了更好地理解我所说的内容,我建议Martin Fowler撰写关于Richardson成熟度模型的文章:

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

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

  

我想在这里使用REST是错误的吗?

你不是错误,但似乎你可能低估了“使用REST”意味着什么。所以IMO,你有两个选择:

  1. 只需使用JAX-WS创建面向服务的API。
  2. 了解REST的真正含义以及如何将其真正应用到您的问题空间。并且不要低估这种复杂性。 REST很难。
  3.   

    我的首席技术官推荐了Java / Tomcat / RestEasy / BlazeDS堆栈,但在我看来(在摆弄了一两天之后)BlazeDS / Flex与REST相处并不好。

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

      

    我应该考虑使用Java-> AMF-> Flex堆栈吗?

    BlazeDS和GraniteDS是我能想到的唯一两个。他们都是很好的IMO,所以请你选择。