Пераклад на беларускую мову Patricia Clausnitzer
Я бачыў некалькі артыкулаў на гэту тэму, але я не знайшоў ніводнага рашэння ва ўсіх выпадках (вэб-сэрвісы, BlazeDS, BlazeDS і ўвесну, кіраванні дадзенымі). Акрамя таго, падыход да BlazeDS адрозніваецца ад той, якая выкарыстоўваецца з Spring / BlazeDS інтэграцыі, і гэта рэч можа быць трохі заблытаным для пачаткоўца.
Давайце выкажам здагадку, што ў вас ёсць пласт паслуг, якія павінны быць выкліканы з Flex прыкладанні. Вы можаце выкрыць гэтыя паслугі як вэб-службы ці ў якасці дыстанцыйных метадаў. Ці вы можаце выкарыстоўваць для кіравання дадзенымі. Java метады, магчыма, пралье памылкі, і вы жадаеце, каб адлюстраваць іх у Flex прыкладанні.
Для прастаты я буду выкарыстоўваць вельмі кароткі метад у якасці прыкладу. Метад подпісу:
public String returnResults() throws DatabaseDownException;
Ёсць чатыры асноўных выпадках:
а) Вы павінны напісаць вэбсэрвіс вярнуць вынік, як XML. Напрыклад:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<result>
</result>
</data>
У гэтым выпадку вам неабходна будзе пашырыць ваш XML, каб дадаць структуру для захоўвання паведамленняў пра памылкі, - вось так:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<result>
</result>
<error>
</error>
</data>
Пры стварэнні XML <error> цела збіраецца канверт за выключэннем паведамленняў. Вядома, больш падрабязную інфармацыю могуць быць дададзены, у тым ліку выключэнне тыпу, ступені цяжару, і гэтак далей. Такі ж падыход павінен быць скарыстаны пры працы з паслугамі SOAP
б) Вы плануеце выкарыстоўваць BlazeDS і Java выдаленага
У гэтым выпадку рэчы будуць лягчэй, таму што BlazeDS здольны аўтаматычна серыялізацыі выкінутага выключэння, і вы можаце знайсці серыялізаваных выключэннем FaultEvent аб'екта. Выкажам здагадку, што ў вас за выключэннем Java заявіў ніжэй. Яна пашырае RuntimeException і гэта метад атрымання карыстацкіх месцах.
public class DatabaseDownException extends RuntimeException{
private String customField;
public String getCustomField(){
return customField;
}
}
Код Flex заяўляе выдаленага аб'екта і рэгіструе апрацоўнік (які таксама ўваходзіць) у выпадку няўдачы.
<mx:RemoteObject id="test" destination="testDestination" result="resultHandler(event)" fault="faultHandler(event)"/>
private function faultHandler(event:FaultEvent):void{
var exception:Object = event.fault.rootCause;
Alert.show(exception.cause);
Alert.show(exception.localizedMessage);
Alert.show(exception.message);
Alert.show(exception.customField);
}
Ёсць чатыры палі ў серыялізаванае выключэнне. Першыя 3 успадкоўваюцца ад Throwable аб'ект, апошні з якіх аб'яўляецца ў выключэнні. Цікава адзначыць, што вам не трэба мець пару ўсталяваць / атрымаць функцыю, каб мець аб'яву серыялізаваны. Throwable аб'ект з'яўляецца адзіным аб'ектам, у якім яно досыць, каб атрымаць метады для таго, каб серыялізаваць значэнні (можна паглядзець на flex.messaging.io.ThrowableProxy для праверкі).
Адзіным недахопам з'яўляецца тое, што вы працуеце з аб'ектамі нетыпізаваныя .. калі вам не падабаецца, што вы можаце кінуць, а выпадкі flex.messaging.MessageException. Гэты клас Java з'яўляецца часткай BlazeDS, і ён будзе дэсерыялізацыі з дапамогай класа mx.messaging.messages.ErrorMessage (атрыманыя ад event.message уласнасці).
Вы можаце дадаць свае дадзеныя ў MessageException класе з выкарыстаннем пашыранага ўласнасці. Напрыклад:
MessageException messageException = new MessageException();
HashMap<String,String> map = new HashMap<String,String>();
map.put("clientName", "JOHN");
map.put("clientSurname", "MASTER");
messageException.setExtendedData(map);
messageException.setCode("ACCOUNT_DISABLED");
throw messageException;
А на боку Flex:
private function faultHandler(event:FaultEvent):void{
var errorMessage:ErrorMessage = event.message as ErrorMessage;
trace(errorMessage.extendedData.clientName);
trace(errorMessage.extendedData.clientSurname);
trace(errorMessage.faultCode);
}
Вы, напэўна, рабіць не жадаюць мець відавочную залежнасць паміж пластом службы і BlazeDS бібліятэкі, так што ў гэтым выпадку вы павінны пабудаваць дэлегата на ім, што таксама будзе выступаць у якасці выключэння перакладнік.
з) выкарыстанне Spring BlazeDS інтэграцыі
У вас ёсць некалькі пераваг пры выкарыстанні Spring BlazeDS інтэграцыі, і калі ваш сярэдні ўзровень ужо выкарыстоўвае Spring гэта неабходна. Выгод, злучаных з апрацоўкай выключэнняў з'яўляецца механізмам выключэннем перакладнік. Гэты перакладнік будзе перахапляць усе выключэнні, ад паслуг выкліканы з Flex, і вы можаце перавесці іх на штосьці больш значным для кліента.
Спачатку трэба абвясціць выключэннем перакладніка:
<bean id="exceptionTranslator" class="com.test.exception.ExceptionTranslatorImpl" />
<flex:message-broker services-config-path="/WEB-INF/flex/services-config.xml">
........
<flex:exception-translator ref="exceptionTranslator" />
</flex:message-broker>
Выключэнне перакладнік ніжэй:
public class ExceptionTranslatorImpl implements ExceptionTranslator{
//handles all
public boolean handles(final Class<?> clazz){
return true;
}
public MessageException translate(final Throwable throwable){
if (throwable instanceof DatabaseDownException){
MessageException exception = new MessageException();
exception.setCode("FATAL_DB_DOWN");
return exception;
}
if ...........//check another things
}
}
Адзначым, што ў бягучай версіі Spring / інтэграцыі BlazeDS гэта ў абавязковым парадку мець выключэннем перакладнік, у адваротным выпадку да памылкі будзе праглынуў, і вы атрымаеце некаторыя агульныя памылкі.
г) выкарыстанне дадзеных кіраванні
Такі ж падыход з кропкі з) і тут. Асноўным ваш асэмблер - якое будзе высылацца на некаторыя паслугі, атрымаць / стварыць дадзеныя - будзе клапаціцца пра пераклад выключэння ў штосьці значных для кліента. Я напісаў некаторы час назад кароткае паведамленне пра тое, што тут.

