如何在Flex应用程序中处理自定义Java异常

3df52oht  于 2022-09-21  发布在  Java
关注(0)|答案(3)|浏览(184)

我们正在使用BlazeDS作为Flex和Java之间的代理。该方法与(http://www.flexpasta.com/index.php/2008/05/16/exception-handling-with-blazeds-and-flex/)中的相同

Java异常声明:

public class FlexException extends RuntimeException {
 private String name = 'John';

 public FlexException(String message) {
   super(message);
 }

 public String getName() {
   return name;
 }
}

然后,我们要把它扔出去:

public void testMethod(String str) throws Exception {
 throw new FlexException("Custom exception");
}

Flex Part:

private function faultHandler(event:FaultEvent):void
{
  var errorMessage:ErrorMessage = event.message as ErrorMessage;
  trace("error++");
}

并且远程对象在这里示例化:

<mx:RemoteObject id="mySample" destination="mySample" channelSet="{cs1}" fault="faultHandler(event)" />

但在event.fault中,我得到“Server.Processing”,event.faultString等于“服务器上有一个未处理的故障。自定义异常”在异常属性中指定了如何接收数据?

更新:配置文件:Messaging-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<adapters>
    <adapter-definition id="actionscript" class="flex.messaging.services.messaging.adapters.ActionScriptAdapter" default="true" />
    <!-- <adapter-definition id="jms" class="flex.messaging.services.messaging.adapters.JMSAdapter"/> -->
</adapters>

<default-channels>
    <channel ref="my-polling-amf"/>
</default-channels>

Proxy-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<service id="proxy-service" 
    class="flex.messaging.services.HTTPProxyService">

    <properties>
        <connection-manager>
            <max-total-connections>100</max-total-connections>
            <default-max-connections-per-host>2</default-max-connections-per-host>
        </connection-manager>
        <allow-lax-ssl>true</allow-lax-ssl>
    </properties>

    <adapters>
        <adapter-definition id="http-proxy" class="flex.messaging.services.http.HTTPProxyAdapter" default="true"/>
        <adapter-definition id="soap-proxy" class="flex.messaging.services.http.SOAPProxyAdapter"/>
    </adapters>

    <default-channels>
        <channel ref="my-amf"/>
    </default-channels>

    <destination id="DefaultHTTP">
    </destination>

</service>

Remoting-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<adapters>
    <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
</adapters>

<default-channels>
    <channel ref="my-amf"/>
</default-channels>

Services-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<services>
    <service-include file-path="remoting-config.xml" />
    <service-include file-path="proxy-config.xml" />
    <service-include file-path="messaging-config.xml" />        
</services>

<security>
    <login-command class="flex.messaging.security.TomcatLoginCommand" server="Tomcat"/>
    <!-- Uncomment the correct app server
    <login-command class="flex.messaging.security.TomcatLoginCommand" server="JBoss">
    <login-command class="flex.messaging.security.JRunLoginCommand" server="JRun"/>        
    <login-command class="flex.messaging.security.WeblogicLoginCommand" server="Weblogic"/>
    <login-command class="flex.messaging.security.WebSphereLoginCommand" server="WebSphere"/>
    -->

    <!-- 
    <security-constraint id="basic-read-access">
        <auth-method>Basic</auth-method>
        <roles>
            <role>guests</role>
            <role>accountants</role>
            <role>employees</role>
            <role>managers</role>
        </roles>
    </security-constraint>
     -->
</security>

<channels>

    <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
        <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
    </channel-definition>

    <channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
        <endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/>
        <properties>
            <add-no-cache-headers>false</add-no-cache-headers>
        </properties>
    </channel-definition>

    <channel-definition id="my-polling-amf" class="mx.messaging.channels.AMFChannel">
        <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpolling" class="flex.messaging.endpoints.AMFEndpoint"/>
        <properties>
            <polling-enabled>true</polling-enabled>
            <polling-interval-seconds>4</polling-interval-seconds>
        </properties>
    </channel-definition>

    <!--
    <channel-definition id="my-http" class="mx.messaging.channels.HTTPChannel">
        <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/http" class="flex.messaging.endpoints.HTTPEndpoint"/>
    </channel-definition>

    <channel-definition id="my-secure-http" class="mx.messaging.channels.SecureHTTPChannel">
        <endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/httpsecure" class="flex.messaging.endpoints.SecureHTTPEndpoint"/>
        <properties>
            <add-no-cache-headers>false</add-no-cache-headers>
        </properties>
    </channel-definition>
    -->
</channels>

<logging>
    <target class="flex.messaging.log.ConsoleTarget" level="Debug">
        <properties>
            <prefix>[BlazeDS] </prefix>
            <includeDate>true</includeDate>
            <includeTime>true</includeTime>
            <includeLevel>true</includeLevel>
            <includeCategory>true</includeCategory>
        </properties>
        <filters>
            <pattern>Endpoint.*</pattern>
            <pattern>Service.*</pattern>
            <pattern>Configuration</pattern>
        </filters>
    </target>
</logging>

<system>
    <redeploy>
        <enabled>false</enabled>
        <!-- 
        <watch-interval>20</watch-interval>
        <watch-file>{context.root}/WEB-INF/flex/services-config.xml</watch-file>
        <watch-file>{context.root}/WEB-INF/flex/proxy-config.xml</watch-file>
        <watch-file>{context.root}/WEB-INF/flex/remoting-config.xml</watch-file>
        <watch-file>{context.root}/WEB-INF/flex/messaging-config.xml</watch-file>
        <watch-file>{context.root}/WEB-INF/flex/data-management-config.xml</watch-file>
        <touch-file>{context.root}/WEB-INF/web.xml</touch-file>
         -->
    </redeploy>
</system>

Spring配置:

<bean id="mySample" class="ru.crystals.pos.testFlexConnection.Test">
    <constructor-arg ref="defaultMessageTemplate" />
    <flex:remoting-destination />
</bean>

这是Tomcat的日志

[BlazeDS]03/23/2010 14:46:51.870 [DEBUG] [Endpoint.AMF] Serializing AMF/HTTP res
ponse
Version: 3
  (Message #0 targetURI=/1/onStatus, responseUR|-)
    (Typed Object #0 'flex.messaging.messages.ErrorMessage')
      headers = (Object #1)
      rootCause = null
      body = null
      correlationId = "2EB1C972-B32B-03BA-825C-8AD8B9DFCEF8"
      faultDetail = null
      faultString = "There was an unhandled failure on the server. Custom except
ion"
      clientId = "89FB2149-6E0F-4FB6-4D5E-EC838139EE90"
      timeToLive = 0.0
      destination = "mySample"
      timestamp = 1.269344811854E12
      extendedData = null
      faultCode = "Server.Processing"
      messageId = "89FB2149-6E1A-4453-6E45-55A93BBA50AF"

下面是我在onFaultHandler:中设置断点时在Flex中得到的结果,因此这个问题就是为什么rootClause为空?其中是我的FlexException,名称=‘John’。

svmlkihl

svmlkihl1#

好的,那么您使用的是Spring-急流-柔韧一体化。在这种情况下,前面链接中描述的机制不能正常工作。您需要创建自己的异常转换器,否则将收到通用服务器。处理错误:。请阅读:http://static.springsource.org/spring-flex/docs/1.0.x/reference/html/ch02s08.html

你也可以在我朋友的博客上读到这篇文章:http://margelatu.org/2009/06/15/meaningful-exceptions-in-lcdsblazeds-applications-using-spring-blazeds-integration/

wvyml7n5

wvyml7n52#

http://sujitreddyg.wordpress.com/2008/02/12/handling-java-exceptions-in-flex-application/

因此,您应该使用:

ErrorMessage.rootCause.Message;errorMessage.rootCause.name;

cvxl0en2

cvxl0en23#

为了正确地(反)序列化自定义属性,您需要一个getter和一个setter。在您的示例中,您应该为Name属性添加一个“setName”setter。

相关问题