如果有任何错误,请原谅我 - 我对 Java 完全陌生。我的任务是为即将推出的 Facebook 游戏设置客户端/服务器架构。在服务器端,我有:
- 爪哇
- 雄猫
- 高枕无忧
- 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!");
如您所见,生成代码的使用者不需要知道端点在哪里,从事件返回什么类型等。我想走这条路线,因为我相信它会更容易维护。这让我想到了我的问题:
- 为什么只为@WebService 和@WebMethod(互联网告诉我是JAX-WS)而不是@Path 生成美妙的Service 和ServiceEvent 对象?是尚未完成的工作,还是鉴于 JAX-RS 和 JAX-WS 之间的规范差异而无法完成的工作?(我看到 as3-endpoint.fmt 专门只适用于代码中的@WebService)
- 我想在这里使用 REST 有错吗?我的 CTO 推荐了 Java/Tomcat/RestEasy/BlazeDS 堆栈,但在我看来(在摆弄了一两天之后)BlazeDS/Flex 与 REST 相处得不太好。
- 是否有我应该考虑的 Java->AMF->Flex 堆栈?
感谢您抽出宝贵时间,如果这些是明显的问题,我再次感到抱歉。我的背景是游戏开发,而不是网络开发。