[akabana-user:125] S2Flex2Serviceのoperation属性が有効じゃない?
Shinpei Ohtani
[E-MAIL ADDRESS DELETED]
2007年 5月 28日 (月) 16:57:59 JST
大谷です。
Dolteng 0.19.0で吐き出したS2Flex2のサンプルで
色々と試しています。
S2Flex2Serviceのoperation属性を使って、
以下のように呼び出すJava側のServiceメソッドを
指定したいとします。
例えばFlex側ではupdateですが、Service側はdoUpdateというようにです。
//config() はcreationCompleteで呼ばれる
public function config():void
{
service.operations["update"] = new RpcOperation(service, "doUpdate");
service.operations["remove"] = new RpcOperation(service, "doRemove");
}
<seasar:S2Flex2Service id="service" destination="emp_empService"
showBusyCursor="true" />
Serviceクラス側も下記のようになります。
public interface EmpService {
public Emp[] selectAll();
public Emp selectById(Integer id);
public void insert(Emp emp);
//以下をupdate, removeから、doUpdate, doRemoveに変更
public int doUpdate(Emp emp);
public void doRemove(Integer id);
}
とすると、意図する呼び出しがされる前にエラーで
落ちてしまいます。
Service側にわたったエラーを見ると、operationsに設定した連想配列をみていないで
Flex側の設定メソッドでService側がcallされているようです。
例えばFlex側がremoveだと、Service側のdoRemoveが呼ばれて欲しいのに
実際にはremoveが呼ばれており、そのようなメソッドが無いと言われています。
サーバ側のエラーは下記のような感じです。
Serviceのremoveを呼ぼうとしています。
ERROR 2007-05-28 16:50:50,671 [http-8080-Processor25]
[ESSR0049]examples.web.emp.impl.EmpServiceImpl$$EnhancedByS2AOP$$9fa2fbに適用可能なメソッド(remove())が見つかりません
org.seasar.framework.beans.MethodNotFoundRuntimeException:
[ESSR0049]examples.web.emp.impl.EmpServiceImpl$$EnhancedByS2AOP$$9fa2fbに適用可能なメソッド(remove())が見つかりません
at org.seasar.framework.beans.impl.BeanDescImpl.getMethods(BeanDescImpl.java:281)
at org.seasar.flex2.rpc.remoting.service.impl.AbstractRemotingServiceInvokerImpl.checkMethodArgumentsValidation(AbstractRemotingServiceInvokerImpl.java:113)
at org.seasar.flex2.rpc.remoting.service.impl.AbstractRemotingServiceInvokerImpl.invoke(AbstractRemotingServiceInvokerImpl.java:52)
at org.seasar.flex2.rpc.remoting.message.processor.impl.MessageBodyProcessorImpl.processBody(MessageBodyProcessorImpl.java:99)
at org.seasar.flex2.rpc.remoting.message.processor.impl.MessageBodyProcessorImpl.process(MessageBodyProcessorImpl.java:65)
at org.seasar.flex2.rpc.remoting.message.processor.impl.MessageProcessorImpl.requestProcess(MessageProcessorImpl.java:76)
at org.seasar.flex2.rpc.remoting.message.processor.impl.MessageProcessorImpl.process(MessageProcessorImpl.java:65)
at org.seasar.flex2.rpc.remoting.processor.impl.RemotingMessageProcessorImpl.process(RemotingMessageProcessorImpl.java:49)
at org.seasar.flex2.rpc.remoting.RemotingGateway.doPost(RemotingGateway.java:66)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
(以下略)
少しだけS2Flex2を追った限りだと、S2Flex2Service.callPropertyで
operationsの連想配列の結果を一回見たうえで
remoteCall.applyするべきではないでしょうか?
下記のようになります。
flash_proxy override function callProperty(methodName:*, ...args):*{
var o:RpcOperation = getProperty(methodName);
if(o) {
args.unshift(o.name);
}
else
{
args.unshift(methodName);
}
return remoteCall.apply(null,args);
}
全然あさっての方向見ていたらすいません。
宜しくお願いします。
--
=============================
Shinpei Ohtani
[E-MAIL ADDRESS DELETED]
=============================
akabana-user メーリングリストの案内