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