【发布时间】:2018-09-03 22:14:01
【问题描述】:
我有以下返回标签名称的投影:
@Projection(types = NewsTag.class, name = "newsTag")
public interface NewsTagProjection {
@Value("#{target.tag.name}")
String getName();
}
我在以下负责 newsTag 模型的存储库中使用它:
@RepositoryRestResource(excerptProjection = NewsTagProjection.class)
public interface NewsTagRepository extends JpaRepository<NewsTag, Integer> {
}
所以当我调用具有 NewsTag 列表的新闻存储库时:
@RepositoryRestResource
public interface NewsRepository extends JpaRepository<News, Integer> {
}
一切正常,它只返回一个带有 nae 的标签列表。
但是如果我想使用具有相同端点的自定义控制器(假设我正在这样做以进行错误处理),它只会返回没有标签列表的新闻,就像投影不存在一样。
这是控制器:
@RepositoryRestController
@RequestMapping("news")
public class NewsController {
private NewsService newsService;
private PagedResourcesAssembler<News> pagedAssembler;
private NewsResourceAssembler newsResourceAssembler;
@Autowired
public void setNewsService(NewsService newsService) {
this.newsService = newsService;
}
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
public void setPagedAssembler(PagedResourcesAssembler<News> pagedAssembler) {
this.pagedAssembler = pagedAssembler;
}
@Autowired
public void setNewsResourceAssembler(NewsResourceAssembler newsResourceAssembler) {
this.newsResourceAssembler = newsResourceAssembler;
}
// Return all news with pagination
@GetMapping
public ResponseEntity<?> getAllNews(Pageable pageable) {
Page<News> newsPage = this.newsService.getAllNews(pageable);
return ResponseEntity.ok(this.pagedAssembler.toResource(newsPage, this.newsResourceAssembler));
}
}
编辑 NewsResourceAssembler:
@Service
public class NewsResourceAssembler implements ResourceAssembler<News, Resource<News>> {
private EntityLinks entityLinks;
@Autowired
public void setEntityLinks(EntityLinks entityLinks) {
this.entityLinks = entityLinks;
}
@Override
public Resource<News> toResource(News news) {
Link self = entityLinks.linkFor(News.class).slash(news.getId()).withSelfRel();
Link newsTags = entityLinks.linkFor(News.class).slash(news.getId()).slash("newsTags").withRel("newsTags");
Link newsComments = entityLinks.linkFor(News.class).slash(news.getId()).slash("newsComments").withRel("newsComments");
return new Resource<>(news, self, newsTags, newsComments);
}
}
【问题讨论】:
-
你能提供
NewsResourceAssembler.class代码吗? -
@drowny 看到我的编辑,谢谢。
标签: java spring spring-boot spring-data spring-rest