Back to site

Пастаянная спасылка на Java-выключэння і Flex

Дадаў кізіл | Рубрыкі Без рубрыкі

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

Давайце выкажам здагадку, што ў вас ёсць пласт паслуг, якія павінны быць выкліканыя з вашага прыкладання Flex. Можна прадастаўляць гэтыя паслугі, як вэб-сэрвісы або як дыстанцыйныя метады. Ці вы можаце выкарыстоўваць для кіравання дадзенымі. Java-метады могуць кідаць памылкі, і вы хочаце, каб адлюстраваць іх у дадатак Flex.

Для прастаты я буду выкарыстоўваць вельмі кароткі метад у якасці прыкладу. Метад подпіс:

грамадскіх returnResults String () кідае 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);
}

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

з) выкарыстанне Інтэграцыя Вясна BlazeDS

У вас ёсць некалькі пераваг пры выкарыстанні Вясна BlazeDS інтэграцыі, і калі ваш сярэдні ўзровень ужо выкарыстоўвае Вясна гэта неабходна. Выгады, звязаныя з апрацоўкай выключэнняў з'яўляецца механізм выключэння перакладчыка. Гэты перакладчык будзе перахапляць усе выключэнні, ад паслуг выкліканы з 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>

Выключэнне перакладчык ніжэй:

адкрыты клас ExceptionTranslatorImpl рэалізуе 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
}
}

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

г) Выкарыстанне кіравання дадзенымі

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

Звярніце ўвагу: гэты артыкул быў перакладзеная таксама на беларускай мове (дзякуй Патрыцыя), вы можаце знайсці яго тут.

Published (Last edited): Aug 12 , source: http://cornelcreanga.com/2010/05/java-exceptions-and-flex/