没有Spring Data REST的Spring投影

时间:2018-09-10 07:01:42

标签: java spring-boot spring-data-jpa

spring-data-rest提供了一种神奇的方式来指定实体的视图-弹簧投影。我很好奇是否有一种无需使用spring-data-rest即可实现类似功能的方法-仅存储库和简单的rest控制器。

假设我有一个实体:

@Entity
public class Customer {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  private String firstname;
  private String lastname;

  // … 
}

和两个控制器端点。一个应该返回完整的实体和该实体的第二个子集(尽管实际示例稍微复杂一点,但仅返回firstname)。基本上,我想避免从某些端点返回嵌套集合。

我知道我可以通过创建第二个实体来实现这一点,该实体指向仅包含所需值的同一张表,但问题是我也必须为其创建一个单独的存储库,并且它会创建许多不必要的存储库样板。

所以我的问题是,我是否需要具有两个带有两个单独存储库的实体,还是在Spring中有一些更优雅的方法?

2 个答案:

答案 0 :(得分:3)

您可以使用Spring的属性过滤器从响应API中过滤掉一些字段:

@RequestMapping(...)
public MappingJacksonValue getUserEntities(...) 
    Page<UserEntity> entities = service.findAll();
    MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(entities);
    FilterProvider filters = new SimpleFilterProvider()
                .addFilter("UserEntity", SimpleBeanPropertyFilter
                        .filterOutAllExcept("fieldName"));
    mappingJacksonValue.setFilters(filters);
    return mappingJacksonValue;
}

答案 1 :(得分:1)

您可以使用JSON Views过滤出所需的字段。这是一些examples

或者,您可以创建DTO而不是完整实体,但是恕我直言,这是一种优雅的方法。