Java 在GWT中将集合转换为客户端

Java 在GWT中将集合转换为客户端,java,gwt,guava,Java,Gwt,Guava,以下代码是GWT RPC serlvet实现, 转换的集合在客户端中显然失败,因为它与GWT不兼容 里面有我丢失的灵魂吗 @Singleton public class DataServiceImpl extends RemoteServiceServlet implements DataService { @Inject ApplicationDao dao; @Inject DtoUtil dtoUtil; public Coll

以下代码是GWT RPC serlvet实现, 转换的集合在客户端中显然失败,因为它与GWT不兼容

里面有我丢失的灵魂吗

@Singleton
public class DataServiceImpl extends RemoteServiceServlet implements
        DataService {

    @Inject
    ApplicationDao dao;

    @Inject
    DtoUtil dtoUtil;

    public Collection<GoalDto> getAllConfiguredGoals() {
        return Collections2.transform(dao.getAllGoals(), new Function<Goal, GoalDto>() {
            public GoalDto apply(@Nullable Goal goal) {
                return dtoUtil.toGoalDto(goal);
            }
        });
    }

}
@Singleton
公共类DataServiceImpl扩展了RemoteServiceServlet实现
数据服务{
@注入
应用道道;
@注入
DtoUtil DtoUtil;
公共集合getAllConfiguredGoals(){
return Collections2.transform(dao.getAllGoals(),new Function()){
要应用的公共目标(@Nullable-Goal-Goal){
返回dtoUtil.toGoalDto(目标);
}
});
}
}

我正在寻找一个本地的番石榴解决方案,而不是一些手工编写的翻译代码。

在这种情况下,番石榴的问题是它使用惰性评估(这通常很好,但在这里不是),并且集合由原始集合备份。唯一的解决办法是强制创建一个新集合,该集合不是由原始对象备份的,并且所有计算都已执行。类似这样的操作应该可以实现(假设GoalDto是GWT可序列化的):

返回新的ArrayList(Collections2.transform(dao.getAllGoals(),new Function()){
要应用的公共目标(@Nullable-Goal-Goal){
返回dtoUtil.toGoalDto(目标);
}
}));

在这种情况下,番石榴的问题在于它使用了惰性评估(这通常是好的,但在这里不是),并且集合由原始集合备份。唯一的解决办法是强制创建一个新集合,该集合不是由原始对象备份的,并且所有计算都已执行。类似这样的操作应该可以实现(假设GoalDto是GWT可序列化的):

返回新的ArrayList(Collections2.transform(dao.getAllGoals(),new Function()){
要应用的公共目标(@Nullable-Goal-Goal){
返回dtoUtil.toGoalDto(目标);
}
}));

我认为如果
函数
对象是GWT-serializable,那么原始版本就可以了。也许是这样,但它可能没有抓住要点。如果要让客户机最终完成这项工作,为什么要在服务器上将
目标
转换为
目标
?在这种情况下,我们通常使用TO,因为服务器使用的对象包含的信息比客户端需要的多。这要么是安全问题,要么是性能问题。无论哪种方式,您都希望在服务器端进行评估。也就是说,就个人而言,我更喜欢使用
ImmutableList.copyOf(…)
,而不是
new ArrayList(…)
@LouisWasserman。这还需要实现GWT可序列化的目标,但这种情况并不常见(通常是来自JPA的实体).@Ray在不可变列表上的正确点。返回的列表是否与GWT兼容?我认为如果
函数
对象是GWT-serializable的,则原始列表可以正常工作。也许是这样,但它可能没有抓住要点。如果要让客户机最终完成这项工作,为什么要在服务器上将
目标
转换为
目标
?在这种情况下,我们通常使用TO,因为服务器使用的对象包含的信息比客户端需要的多。这要么是安全问题,要么是性能问题。无论哪种方式,您都希望在服务器端进行评估。也就是说,就个人而言,我更喜欢使用
ImmutableList.copyOf(…)
,而不是
new ArrayList(…)
@LouisWasserman。这还需要实现GWT可序列化的目标,但这种情况并不常见(通常是来自JPA的实体).@Ray在不可变列表上的正确点。返回的列表是否与GWT兼容?有关序列化转换集合的轻微相关问题:有关序列化转换集合的轻微相关问题:
return new ArrayList<GoalDto>(Collections2.transform(dao.getAllGoals(), new Function<Goal, GoalDto>() {
        public GoalDto apply(@Nullable Goal goal) {
            return dtoUtil.toGoalDto(goal);
        }
    }));