Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AMF/JAX-RS问题(一些是一般性的,一些是具体的)_Java_Apache Flex_Jax Ws_Jax Rs_Enunciate - Fatal编程技术网

Java AMF/JAX-RS问题(一些是一般性的,一些是具体的)

Java AMF/JAX-RS问题(一些是一般性的,一些是具体的),java,apache-flex,jax-ws,jax-rs,enunciate,Java,Apache Flex,Jax Ws,Jax Rs,Enunciate,如果有任何错误,请原谅我——我对Java完全陌生。我的任务是为即将到来的Facebook游戏设置客户端/服务器架构。在服务器端,我有: 爪哇 雄猫 放松 火焰 阐明 所有人都和马文在一起。我可以用@Path()注释RESTful端点,当我在浏览器中点击它们时,它们将吐出在AMF中序列化的对象。到现在为止,一直都还不错。现在我需要在客户端/Flex端使用这些端点。Enounciate已经为我在Java中用@XmlRootElement注释的类型生成了文件,我可以在AS3代码中使用这些类型。问题

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

  • 爪哇
  • 雄猫
  • 放松
  • 火焰
  • 阐明
所有人都和马文在一起。我可以用@Path()注释RESTful端点,当我在浏览器中点击它们时,它们将吐出在AMF中序列化的对象。到现在为止,一直都还不错。现在我需要在客户端/Flex端使用这些端点。Enounciate已经为我在Java中用@XmlRootElement注释的类型生成了文件,我可以在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);
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标记而不是@Path,那么我的服务类的优秀强类型AS3包装器将由Enounciate生成,以及相应的AS3事件。它还生成正确的services-config.xml!然后,用法变成如下所示:

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);
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!");
正如您所看到的,生成代码的使用者不需要知道端点在哪里,从事件返回什么类型,等等。我想走这条路,因为我相信这样会更容易维护。这就引出了我的问题:

  • 为什么奇妙的服务和ServiceEvent对象只为@WebService和@WebMethod(互联网告诉我是JAX-WS)生成,而不为@Path生成?考虑到JAX-RS和JAX-WS之间的规范差异,是尚未完成的工作,还是无法完成的工作?(我看到as3-endpoint.fmt在代码中专门应用于@WebService)
  • 我想在这里使用REST是错的吗?Java/Tomcat/RestEasy/BlazeDS堆栈是由我的CTO推荐的,但在我看来(在摆弄了一两天之后),BlazeDS/Flex与REST的关系似乎不太好
  • 我是否应该考虑Java->AMF->Flex堆栈
  • 感谢您抽出时间,如果这些是明显的问题,我再次表示歉意。我的背景是游戏开发,而不是网页开发

    为什么奇妙的服务和ServiceEvent对象只为@WebService和@WebMethod(互联网告诉我是JAX-WS)生成,而不为@Path生成?考虑到JAX-RS和JAX-WS之间的规范差异,是尚未完成的工作,还是无法完成的工作?(我看到as3-endpoint.fmt在代码中专门应用于@WebService)

    这是可以完成的工作,但还没有完成。还有一个尚未回答的问题,那就是是否应该这样做

    休息很难。面向服务的API(例如SOAP、AMF)对开发人员来说更加直观。JAX-RS使创建RESTAPI变得容易,但代价是给开发人员更多的束缚。更具体地说,JAX-RS使创建基于HTTP的API变得容易,但仅仅因为它使用HTTP并不能使其成为REST。为了更好地理解我所说的,我建议马丁·福勒(Martin Fowler)写一篇关于理查森成熟度模型的文章:

    因此,除了发出HTTP请求和解析响应,还有很多事情要做。通过扩展,创建调用JAX-RS资源(即@Path)的客户端服务要比在方便的AMF服务类中包装HTTP调用多得多。缓存、分层、HATEOAS等都起作用,并且必须“隐藏”在由Enounciate生成的客户端服务中

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

    你没有错,但你似乎低估了“使用REST”的意义。在我看来,你有两个选择:

  • 只需使用JAX-WS创建一个面向服务的API
  • 去了解REST到底是什么,以及如何将其真正应用到您的问题空间中。不要低估了其中的复杂性。休息很难
  • Java/Tomcat/RestEasy/BlazeDS堆栈是由我的CTO推荐的,但在我看来(在摆弄了一两天之后),BlazeDS/Flex与REST的关系似乎不太好

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

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


    BlazeDS和GraniteDS是我能想到的唯一两个。在我看来,它们都很好,所以请随意挑选。

    感谢您提供的信息丰富的回复。在您回复之前,我做了更多的挖掘,并决定将JAX-WS与AMF结合使用是更好的方法。我很高兴你的建议也一样。BlazeDS是为RPC而不是REST设计的。在Flex中,您可以使用REST服务和基于WSDL的服务,而无需BlazeDS或GraniteDS等中间件解决方案。如果您想用AMF序列化服务调用的结果和参数,您需要在服务器端使用BlazeDS—毕竟AMF是最优化的序列化协议之一。