在将属性保留在不同响应上的特定页面响应中的正确方法是什么?
在我的春季启动API中,我有一个实体MyEntity
,一个具有2个端点/myentities
和/myentities/{id}
的控制器。
-
/myentities
返回Page<MyEntity>
响应。 -
/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}
响应。
我尝试了几次尝试,都误导了:
@JsonIgnore
/@JsonIgnoreProperties
onprivate string content;
" jsonigning"该属性将忽略两个端点上的
content
。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);
然后我在服务层中使用了一个可怕的嵌套/其他磁化。另一个解决方案,例如获取实体的所有属性,然后绘制映射属性使流量保持较高。考虑到方形增长的实施,根据规格的数量,我真的希望有一个正确的解决方案来解决规范 投影。