s2flex2を使った際にS2Flex2に登録されているServiceを呼び出す際に複数のパラメータが渡せなくて困っているということを聞きました。
複数パラメータ対応は、ずいぶん前に(名称変更するまえ)修正したつもりになっていました。
また、できていないと足し算サンプルも動かなくなってしまう事になります。
再度確認してみました。
1.Dtoの作成
パラメータとして受け渡すDtoを作成します。パラメータ用に2つ、Flex側に返す用に1つ合計3つ作ります。対応するASファイルも作るので合計6つ(>_<)です。
まずは、Javaのクラスから。
TypeADto.java:
package examples.flex2.param.dto;import java.util.Date;
public class TypeADto {
private String firstName;
private String lastName;
private int age;
private Date birthDay;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
TypeBDto.java:
package examples.flex2.param.dto;public class TypeBDto {
private String deptCd;
private String dept;
private int type;
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public String getDeptCd() {
return deptCd;
}
public void setDeptCd(String deptCd) {
this.deptCd = deptCd;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
最後に、Flexアプリケーションに返すTypeCDto.javaです。
package examples.flex2.param.dto; public class TypeCDto { private TypeADto a; private TypeBDto b; public TypeADto getA() { return a; } public void setA(TypeADto a) { this.a = a; } public TypeBDto getB() { return b; } public void setB(TypeBDto b) { this.b = b; } }
つぎにFlexで使う、ASファイルを作ります。
自動変換する為にメタタグRemoteClassを定義しておきます。
テストなのですべてpublicで定義しています。m(__)m
package examples.flex2.param
{
[RemoteClass(alias="examples.flex2.param.dto.TypeADto")]
public class TypeADto
{
public var firstName:String;
public var lastName:String;
public var age:int;
public var birthDay:Date;
}
}package examples.flex2.param
{
[RemoteClass(alias="examples.flex2.param.dto.TypeBDto")]
public class TypeBDto
{
public var deptCd:String;
public var dept:String;
public var type:int;
}
}package examples.flex2.param
{
[RemoteClass(alias="examples.flex2.param.dto.TypeCDto")]
public class TypeCDto
{
public var a:TypeADto;
public var b:TypeBDto;
}
}
2.Serviceのインターフェースを作成
まず最初に呼び出されるServiceのインターフェースを作成します。 パラメータに2つのDtoを渡します。package examples.flex2.param.service;import examples.flex2.param.dto.TypeADto;
import examples.flex2.param.dto.TypeBDto;
import examples.flex2.param.dto.TypeCDto;public interface ParamCheckService {
public TypeCDto getTypeCDto(int index,TypeADto aDto,TypeBDto b);
}
3.Serviceの実装作成
次に作成した、ParamCheckServiceの実装を作ります。 サンプルとしていいか?とも思いますが、こんな感じ。package examples.flex2.param.service.impl;import java.util.Calendar;
import examples.flex2.param.dto.TypeADto;
import examples.flex2.param.dto.TypeBDto;
import examples.flex2.param.dto.TypeCDto;public class ParamCheckServiceImpl {
public TypeCDto getTypeCDto(int index,TypeADto aDto,TypeBDto b){
TypeCDto typeCDto = new TypeCDto();
aDto.setAge(35);
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR,1970);
cal.set(Calendar.MONTH,3);
cal.set(Calendar.DATE,1);
cal.getTime();
aDto.setBirthDay(cal.getTime());
b.setType(450);
typeCDto.setA(aDto);
typeCDto.setB(b);
return typeCDto;
}
}
4.mxmlの作成
ここまできてやっとmxmlファイルを作成します。<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
xmlns:s2="http://www.seasar.org/s2flex2/mxml">
<mx:Script>
<![CDATA[
import examples.flex2.param.TypeCDto;
import examples.flex2.param.TypeBDto;
import examples.flex2.param.TypeADto;
import mx.utils.ObjectUtil;
import mx.utils.XMLUtil;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
private function onResult(resultEvent:ResultEvent):void{
var typeC:TypeCDto = resultEvent.result as TypeCDto;
ret_text.text=ObjectUtil.toString(
typeC);
}
private function onFault(faultEvent:FaultEvent):void{
ret_text.text=ObjectUtil.toString(faultEvent.fault);
}
private function doService():void{
var typeA:TypeADto = new TypeADto();
var typeB:TypeBDto = new TypeBDto();
var typeC:TypeCDto = new TypeCDto();
typeA.age=100;
typeA.firstName="jerry";
typeA.lastName="marando";
typeB.dept="欺術";
typeB.deptCd="1";
typeB.type=3;
paramCheckService.getTypeCDto(6,typeA,typeB);
}
]]>
</mx:Script>
<s2:S2Flex2Service id="paramCheckService"
destination="paramCheckService"
result="onResult(event)" fault="onFault(event)" />
<mx:TextArea x="52" y="47" height="188" width="356" id="ret_text"/>
<mx:Button x="52" y="258" label="paramCheckService" click="doService()"/>
</mx:Application>
作成したmxmlを実行してデバッガで確認したところ、無事にパラメータの受け渡しができました。また、flex2.0側でも、受け取れました。
このケースもまた、パラメータが渡されないという別のケースがあるのでしょうか...
S2Flex2
http://s2flex2.seasar.org/ja/
この記事に対するコメント