将属性隐藏在Spring JPA页面结果中



在将属性保留在不同响应上的特定页面响应中的正确方法是什么?

在我的春季启动API中,我有一个实体MyEntity,一个具有2个端点/myentities/myentities/{id}的控制器。

  1. /myentities返回Page<MyEntity>响应。
  2. /myentities/{id}返回带有ID {id}的单个MyEntity对象:

类骨气:

// MyEntity:
@Entity
@Table(name = "myentities")
public class MyEntity extends AuditModel {
    @Id
    @Column(name = "id", updatable=false)
    private long id;
    @Size(min = 3, max = 100)
    private String title;
    @Column(columnDefinition = "text")
    private String content;
    public MyEntity() {
        super();
    }
    public MyEntity(String title, String alias, String content) {
        super();
        this.title = title;
        this.content = content;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
}

带有两个端点的RestController:

// controller methods:
@RequestMapping(value = "/myentities", method = RequestMethod.GET)
public Page<MyEntity> getPagedMyEnities(
    @RequestParam(name = "after", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") Date after,
    @RequestParam(name = "before", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") Date before,
    @RequestParam(name = "title", required = false) String title,
    @PageableDefault(sort = { "createdAt" }, direction = Sort.Direction.DESC, page = 0, value = 10) Pageable pageable) {
    // ..createdAfter(),createdBefore(),titleContains() skipped..
    Specification<MyEntity> spec =
        where((createdAtAfter(after))
            .and(createdAtBefore(before))
            .and(titleContains(title));
    // MyEntityRepository extends JpaRepository<MyEntity, Long>, JpaSpecificationExecutor<MyEntity>
    return this.myEntityRepository.findAll(spec, pageable);
}
@RequestMapping(value = "/myentities/{id}", method = RequestMethod.GET)
public ResponseEntity<?> getMyEntity(@PathVariable(value = "id") long id) {
    return ResponseEntity.status(HttpStatus.OK)
            .body(this.myEntityRepository.findById(id));
}

一切正常,但是content Myentity的属性是一个巨大的字符串,减慢了/myentities的响应时间。我想立即隐藏页面响应的content属性,并仅适用于/myentities/{id}响应。

我尝试了几次尝试,都误导了:

  1. @JsonIgnore/ @JsonIgnoreProperties on private string content;

    " jsonigning"该属性将忽略两个端点上的content

  2. a(实施我自己的@JsonComponent MyEntitySerializer extends JsonSerializer<MyEntity>

    MyEntitySerialializer确实只写了这些字段,我想在我的响应中序列化。这种序列化处理器方法也序列都可以序列的端点。

    b(实施我自己的@JsonComponent MyEntityPageSerializer extends JsonSerializer<Page<MyEntity>>

    Myentity的PageSerializer通过页面的内容迭代,并序列化content以外的所有属性。这种方法的作品导致页面响应缺少content属性的属性,同时仍将content属性保留在单个Merentity的单个/myentities/{id}响应中。

    糟糕的是,MyEntitySerializer extends Page<MyEntity>将用于任何通用Page<T>响应,然后为MyEntity以外的任何其他内容提供例外。

在将属性保留在不同请求下的同时,忽略特定页面响应中JSONProperties的正确方法是什么?

您无法将投影与Spring JPA结合使用,如我所发现的,例如这里

作为解决方法,我在我的MyentityRepository中实现了所有8个组合:

Page<MyEntityProjection> findAllByTitleContainingAndCreatedAtAfterAndCreatedAtBefore(String title, Date after, Date before, Pageable pageable);
Page<MyEntityProjection> findAllByCreatedAtAfterAndCreatedAtBefore(Date after, Date before, Pageable pageable);
Page<MyEntityProjection> findAllByTitleContainingAndCreatedAtBefore(String title, Date before, Pageable pageable);
Page<MyEntityProjection> findAllByCreatedAtBefore(Date before, Pageable pageable);
Page<MyEntityProjection> findAllByTitleContainingAndCreatedAtAfter(String title, Date after, Pageable pageable);
Page<MyEntityProjection> findAllByCreatedAtAfter(Date after, Pageable pageable);
Page<MyEntityProjection> findAllByTitleContaining(String title, Pageable pageable);
Page<MyEntityProjection> findAllProjectedBy(Pageable pageable);

然后我在服务层中使用了一个可怕的嵌套/其他磁化。另一个解决方案,例如获取实体的所有属性,然后绘制映射属性使流量保持较高。考虑到方形增长的实施,根据规格的数量,我真的希望有一个正确的解决方案来解决规范 投影。

最新更新