SpEL:要映射的列表元素的投影

SpEL: Projection of list elements to map

我有一个 Spring 数据 MongoDB 托管实体,它在其子集合中存储元素列表。为了通过 Spring MVC 仅 return 此实体的一个子集,我使用 projections 自定义数据对象的视图。

用于可视化我的设置的简化示例:

@Getter
@Setter
@Document(collection = "test")
public class CompanyEntity {

    @Id
    private String id;
    private List<Employee> employees;
    ...
}

用户是:

@Getter
@Setter
public class Employee {

    private String id;
    private String name;
    ...
}

该视图是一个简单的界面,如下所示:

public interface CompanyView {

    String getId();
    @Value("#{target.employees.![name]}")
    List<String> getEmployeeNames();
}

虽然我可以直接通过 #{target.employees.![name]} 将员工的姓名直接投射到列表中,但我不知何故迷失了尝试使用 employee.id 将当前代码替换为地图键和 employee.name 作为值。

这甚至可能吗,还是我必须写一个 custom function 因此?

好的,我想我找到了一个令我满意的解决方案。

为了创建类似的东西:

@Value("#{target...}")
Map<String, String> getEmployees();

我现在正在定义一个名为 EmployeeView 的新子投影,我将其用作 List 到 return 的类型。

public interface EmployeeView {
    String getId();
    String getName();
}

CompanyView 中,定义现在看起来像这样:

@Value("#{target.employees}")
List<EmployeeView> getEmployees();

这 return 只是 returned 数据中有限的员工子集。