BlazeDS没有处理Java内部类DTO

时间:2011-08-19 17:35:13

标签: java flex blazeds dto

我注意到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,但在将数据从Flex通过BlazeDS传回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 方法将起作用。另一方面,调用 updateUser updatePhone 方法会导致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);

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

内部课程

不,开箱即用不支持将别名发送到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"