技巧是在子类型投影中使用继承:
@Projection(name = "summary", types = Message.class)
public class MessageSummary {
@Value("#{target.getClass().getSimpleName()}")
String getType();
}
@Projection(name = "summary", types = TextMessage.class)
public class TextMessageSummary extends MessageSummary { ... }
@Projection(name = "summary", types = TodoMessage.class)
public class TodoMessageSummary extends MessageSummary {
Boolean getIsDone();
}
春季休息@RepositoryRestResource
使用具体子类型投影返回消息数组( isDone 必须出现在 TodoMessage 实例中)
如果您需要将相同的内容制作成扩展,那么这个问题会更复杂一些@RequestMapping
into a Controller
,为此我使用下一个 snipeed:
Page<Message> results = repository.findAll(predicate, pageable);
Converter<? super Message, ? extends MessageSummary> converter= l -> {
if(l instanceof TextMessage){
return projectionFactory.createProjection(TextMessageSummary.class,l);
}
else if(l instanceof TodoMessage){
return projectionFactory.createProjection(TodoMessageSummary.class,l);
}
else {
return projectionFactory.createProjection(MessageSummary.class,l);
}
};
Page<MessageSummary> projected =results.map(converter);
return pagedAssembler.toResource(projected);
注意,如果只需要资源类型信息在前端用于只读目的(即对于 POST/PUT 使用具体子类型端点)我认为实际上并不需要使用@JsonTypeInfo因为在投影中使用 SpEL 可以更轻松、更灵活地获取此类信息:
@Value("#{target.getClass().getSimpleName()}")
String getType();