BlazeDS不处理Java内部类DTO
我注意到BlazeDS有一些它不支持的东西,而且通常很难找到它。例:多态性不是。必须创建具有不同名称的方法,因为具有相同名称和不同参数的方法会创建冲突 我试图找出BlazeDS是否不支持Java静态和非静态内部类。 指出问题的示例的详细信息: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; ....
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方法将起作用。另一方面,调用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);
至于静态类,我也非常怀疑它们是否也可以使用。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内部类的序列化。