x

Einloggen

Hast du noch keinen Account? Jetzt registrieren!

Java выключэнні і Flex

Original on cornelcreanga.com
Пераклад на беларускую мову 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 гэта ў абавязковым парадку мець выключэннем перакладнік, у адваротным выпадку да памылкі будзе праглынуў, і вы атрымаеце некаторыя агульныя памылкі.

г) выкарыстанне дадзеных кіраванні

Такі ж падыход з кропкі з) і тут. Асноўным ваш асэмблер - якое будзе высылацца на некаторыя паслугі, атрымаць / стварыць дадзеныя - будзе клапаціцца пра пераклад выключэння ў штосьці значных для кліента. Я напісаў некаторы час назад кароткае паведамленне пра тое, што тут.