Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BlazeDS不处理Java内部类DTO_Java_Apache Flex_Blazeds_Dto - Fatal编程技术网

BlazeDS不处理Java内部类DTO

BlazeDS不处理Java内部类DTO,java,apache-flex,blazeds,dto,Java,Apache Flex,Blazeds,Dto,我注意到BlazeDS有一些它不支持的东西,而且通常很难找到它。例:多态性不是。必须创建具有不同名称的方法,因为具有相同名称和不同参数的方法会创建冲突 我试图找出BlazeDS是否不支持Java静态和非静态内部类。 指出问题的示例的详细信息: public class UserDTO { private String name; private AddressDTO adddress; private PhoneDTO phone; ....

我注意到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);

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

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

内部类 不,不支持立即将别名为Actionscript的对象发送到Java内部类(静态或其他)

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

但是,您可以通过让类实现来实现这一点。()

IExternalizable
的另一种替代方法是使用一种方法,它提供了对Java枚举发送到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"
// In flex...
remoteObject.echo(new Employee()) // Recieves "Hello, I'm an employee"
remoteObject.echo(new Manager()) // Recieves "Hello, I'm a Manager"
然而,正如你的问题所述,这不是一个多元主义的例子。这是方法重载,这是不同的

支持多态性,如下所示:

// 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";
    }
}
执行如下:

remoteObject.echo("Hello") // result from service is "Received String"
remoteObject.echo(new Date()) // result from service is "Received object of type java.util.Date"
// In flex...
remoteObject.echo(new Employee()) // Recieves "Hello, I'm an employee"
remoteObject.echo(new Manager()) // Recieves "Hello, I'm a Manager"
如果我们删除
echo(Employee)
方法,则结果是:

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

这是不对的。Actionscript中支持多态性。方法重载(OP暗指的)不是。此外,如果使用
registerClassAlias
注册类,而不是使用
[RemoteClass]
元标记,则支持actionscript内部类的序列化。