Tap*_*ose 45 java object lambdaj
在我的应用程序架构中,我通常通过服务层将对象或对象列表从数据访问层发送到Web层,其中这些对象从DAO对象转换为DTO对象,反之亦然.Web层对DAO对象没有任何访问权限,DAO层不使用DTO.
为了演示,我通常将代码编写为:
@Transactional(readOnly = true)
public List<UserDTO> getAllUserAsUserDTO() {
    List<UserDTO> userDTOs = new ArrayList<UserDTO>();
    for(User user : getAllUser()) {
        userDTOs.add(constructUserDTO(user));
    }
    return userDTOs;
}
private UserDTO constructUserDTO(User user) {
    UserDTO userDTO = new UserDTO();
    userDTO.setFullName(user.getFullName());
    userDTO.setId(user.getId());
    userDTO.setUsername(user.getUsername());
    userDTO.setRole(user.getRole());
    userDTO.setActive(user.isActive());
    userDTO.setActiveText(user.isActive() ? "Active" : "Inactive");
    return userDTO;
}
这里用户是数据库实体:
@javax.persistence.Entity
@Table(name = "USER")
public class User extends Entity {
    @Transient
    private static final long serialVersionUID = -112950002831333869L;
    private String username;
    private String fullName;
    private boolean active;
    private String role;
    // other fields
    public User() {
        super();
    }
    @NaturalId
    @Column(name = "USERNAME", nullable = false)
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @Column(name = "FULL_NAME")
    public String getFullName() {
        return fullName;
    }
    public void setFullName(String fullName) {
        this.fullName = fullName;
    }
    @Column(name = "ACTIVE", nullable = false)
    public boolean isActive() {
        return active;
    }
    public void setActive(boolean active) {
        this.active = active;
    }
    @Column(name = "ROLE")
    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }
}
这是UserDTO:
public class UserDTO extends BaseDTO {
    private static final long serialVersionUID = -3719463614753533782L;
    private String username;
    private String fullName;
    private String role;
    private String activeText;
    private Boolean active;
    //other properties
    public UserDTO() {
        super();
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getFullName() {
        return fullName;
    }
    public void setFullName(String fullName) {
        this.fullName = fullName;
    }
    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }
    public String getActiveText() {
        return activeText;
    }
    public void setActiveText(String activeText) {
        this.activeText = activeText;
    }
    public Boolean getActive() {
        return active;
    }
    public void setActive(Boolean active) {
        this.active = active;
    }
}
所以我想知道这是否是在两个对象之间复制属性的唯一方法.我想我不确定.我也在使用lambdaj,所以在这个API中有一个方法可以通过它复制所有这些属性来创建其他对象的列表吗?
这个主题可能听起来很主观,但我真的想从专家那里了解到,在最大字段具有相同字符串的情况下,可以将对象从一种形式转换为另一种形式的方式.
Lan*_*Lan 27
您可以使用Apache Commmons Beanutils.API是
org.apache.commons.beanutils.PropertyUtilsBean.copyProperties(Object dest, Object orig). 
对于属性名称相同的所有情况,它将属性值从"origin"bean复制到"destination"bean.
现在我要离题了.使用DTO主要被认为是EJB3中的反模式.如果您的DTO和您的域对象非常相似,则实际上不需要重复代码.DTO仍然具有优点,特别是在涉及远程访问时节省网络带宽.我没有关于您的应用程序架构的详细信息,但如果您谈到的层是逻辑层而不是跨网络,我认为不需要DTO.
我有一个应用程序,我需要将其从JPA实体转换为DTO,然后我考虑了一下,最后提出了org.springframework.beans.BeanUtils.copyProperties用于复制简单属性以及扩展和org.springframework.binding.convert.service.DefaultConversionService用于转换复杂属性的应用程序。
详细地说,我的服务是这样的:
@Service("seedingConverterService")
public class SeedingConverterService extends DefaultConversionService implements ISeedingConverterService  {
    @PostConstruct
    public void init(){
        Converter<Feature,FeatureDTO> featureConverter = new Converter<Feature, FeatureDTO>() {
            @Override
            public FeatureDTO convert(Feature f) {
                FeatureDTO dto = new FeatureDTO();
                //BeanUtils.copyProperties(f, dto,"configurationModel");
                BeanUtils.copyProperties(f, dto);
                dto.setConfigurationModelId(f.getConfigurationModel()==null?null:f.getConfigurationModel().getId());
                return dto;
            }
        };
        Converter<ConfigurationModel,ConfigurationModelDTO> configurationModelConverter = new Converter<ConfigurationModel,ConfigurationModelDTO>() {
            @Override
            public ConfigurationModelDTO convert(ConfigurationModel c) {
                ConfigurationModelDTO dto = new ConfigurationModelDTO();
                //BeanUtils.copyProperties(c, dto, "features");
                BeanUtils.copyProperties(c, dto);
                dto.setAlgorithmId(c.getAlgorithm()==null?null:c.getAlgorithm().getId());
                List<FeatureDTO> l = c.getFeatures().stream().map(f->featureConverter.convert(f)).collect(Collectors.toList());
                dto.setFeatures(l);
                return dto;
            }
        };
        addConverter(featureConverter);
        addConverter(configurationModelConverter);
    }
}