【问题标题】:BlazeDS not handling Java inner class DTOBlazeDS 不处理 Java 内部类 DTO
【发布时间】:2011-08-19 17:35:13
【问题描述】:

我注意到 BlazeDS 有一些它不支持的东西,而且通常很难找到它。例如:多态性不是。必须创建具有不同名称的方法,因为具有不同参数的相同名称的方法会产生冲突。

我正在尝试找出 BlazeDS 是否不支持 Java 静态和非静态内部类。 指出问题的示例的详细信息:

public class UserDTO {
     private  String name;
     private AddressDTO adddress;
     private PhoneDTO phone;
     ....

     public static class PhoneDTO {
          private String phoneNumber;
          .....
     }

     public class AddressDTO {
          private String address;
          .....
     }

此代码在通过 BlazeDS 将数据传递给 Flex 时似乎可以正常工作,但在通过 BlazeDS 将数据从 Flex 传递回 Java 时会导致错误。

@Service
@RemotingDestination(channels = { "my-amf" }, value = "UserService")
public class UserService {
   ....
   public UserDTO getUser(Long userID) {
      .....
      return userDTO;
   }

   public void updateUser(UserDTO userDTO) {
     ....
   }

   public void updatePhone(PhoneDTO phoneDTO) {
      .....
   }

上面的示例代码将编译并且 getUser 方法将起作用。另一方面,调用 updateUserupdatePhone 方法会导致 BlazeDS 错误。是否有特殊的方法可以在 Flex 中使用内部类或不支持内部类?

以下是产生的错误消息的示例:

[BlazeDS]Cannot create class of type 'com.test.dto.UserDTO.PhoneDTO'.
flex.messaging.MessageException: Cannot create class of type 'com.test.dto.UserDTO.PhoneDTO'. Type 'com.test.dto.UserDTO.PhoneDTO' not found.

示例 Flex 代码:

var thisPhone:PhoneDTO = new PhoneDTO();
thisPhone.phoneNumber = "8885551212";
updateTagsResult.token = userService.updatePhone(thisPhone);

【问题讨论】:

    标签: java apache-flex blazeds dto


    【解决方案1】:

    至于静态类,我也很怀疑它们是否也能被使用。静态类在 Actionscript 中是可能的,但只能在同一个文件中(私有静态),我不相信 AMF3 支持它。

    AMF3 的目的只是为了在类之间进行简单的属性序列化。任何比这更复杂的事情都很难转移,坦率地说,首先不应该做,因为复杂性很可能会影响你的开发。这就是 Java 有 DTO 的原因。可以使用您选择的数据协议将其传输到任何语言的抽象数据对象。

    【讨论】:

    • 这是不正确的。 Actionscript 支持多态性。方法重载(OP 暗示)不是。此外,还支持 actionscript 内部类的序列化,前提是该类使用 registerClassAlias 注册,而不是使用 [RemoteClass] 元标记。
    【解决方案2】:

    内部类

    不,开箱即用不支持发送别名为 Java 内部类(静态或其他)的 Actionscript 对象。

    如您所见,反序列化 AMF 数据包时,类名被解释为外部类,而不是内部类。

    但是,您可以通过让您的类实现 IExternalizable 来自己实现这一点。 (See here for further information)

    IExternalizable 的替代方法是使用similar to this one 方法,它支持将Java Enum 发送到Flex。他们使用自定义解串器端点。

    为了完整起见,我应该指出支持序列化 Actionscript 内部类,但不支持 [RemoteClass] 元标记。相反,内部类必须使用registerClassAlias 显式注册,通常在外部类的静态方法中。

    多态性

    更正原帖中的一点:

    .... 例如:多态性不是。必须创建具有不同名称的方法,因为具有不同参数的相同名称的方法会产生冲突。

    鉴于 BlazeDS 是一种服务器端产品,我假设您指的是 BlazeDS 在 Java 中处理多态性和重载的方式。在这种情况下,您的陈述是不正确的。

    例如下面的代码是有效的:

    @RemotingDestination
    public class EchoService {
    public String echo(String source)
    {
        return "Received String";
    }
    public Object echo(Object source)
    {
        return "Recieved object of type " + source.getClass().getName();
    }
    

    执行如下:

    remoteObject.echo("Hello") // result from service is "Received String"
    remoteObject.echo(new Date()) // result from service is "Received object of type java.util.Date"
    

    但是,正如您的问题所述,这不是多态的示例。这是方法重载,不一样。

    支持多态性,如下所示:

    // Java
    // This method on EchoService
    public String echo(Employee employee)
    {
        return employee.sayHello();
    }
    
    public class Employee {
    
        public String sayHello() {
            return "Hello, I'm an employee";
        }
    
    }   
    public class Manager extends Employee {
    
        @Override
        public String sayHello() {
            return "Hello, I'm a Manager";
        }
    }
    

    执行如下:

    // In flex...
    remoteObject.echo(new Employee()) // Recieves "Hello, I'm an employee"
    remoteObject.echo(new Manager()) // Recieves "Hello, I'm a Manager"
    

    如果我们去掉echo(Employee employee)方法,那么结果是:

    // In flex...
    remoteObject.echo(new Employee()) // Recieves "Recieved object of type Employee"
    remoteObject.echo(new Manager()) // Recieves "Recieved object of type Manager"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2015-09-12
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 2011-04-05
      相关资源
      最近更新 更多