我有一个Spring Boot 1.5.7项目,Spring Data REST,Hibernate,Spring JPA,Swagger2。
我有两个像这样的豆子:
@Entity
public class TicketBundle extends AbstractEntity {
private static final long serialVersionUID = 404514926837058071L;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Note> notes = new ArrayList<>();
.....
}
和
@Entity
public class Note extends AbstractEntity {
private static final long serialVersionUID = -5062313842902549565L;
@Lob
private String text;
...
}
我通过Repository公开我的方法:
@Transactional
@RepositoryRestResource(excerptProjection = TicketBundleProjection.class)
@PreAuthorize("isAuthenticated()")
public interface TicketBundleRepository extends PagingAndSortingRepository<TicketBundle, Long> {
....
}
所以大摇大摆地看到我感兴趣的端点是从特定故障单捆绑中加载笔记集合所需的:
现在,我想覆盖默认的GET /api/v1/ticketBundles/{id}/notes
并将其替换为我放入TicketBundleRepository
的自定义方法:
@Transactional(readOnly = true)
@RestResource(rel = "ticketBundleNotes", path = "/ticketBundles/{id}/notes")
@RequestMapping(method = RequestMethod.GET, path = "/ticketBundles/{id}/notes")
@Query("SELECT n FROM TicketBundle tb JOIN tb.notes n WHERE tb.id=:id ORDER BY n.createdDate DESC,n.id DESC")
public Page<Note> getNotes(@Param("id") long id, Pageable pageable);
以这种方式创建查询非常方便,因为我需要使用Pageable并返回一个Page。不幸的是,我现在有两个问题。
第一个问题
该方法映射到/api/v1/ticketBundles/search/ticketBundles/{id}/notes
的端点/api/v1/ticketBundles/ticketBundles/{id}/notes
instad上
第二个问题 当我从swagger调用方法时,我收到HTTP 404:
请求似乎错了。似乎路径变量不被理解:
curl -X GET --header 'Accept: application/json' 'http://localhost:8080/api/v1/ticketBundles/search/ticketBundles/{id}/notes?id=1'
这是来自服务器的响应:
{
"timestamp": "2017-10-05T14:00:35.563+0000",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/api/v1/ticketBundles/search/ticketBundles/%7Bid%7D/notes"
}
服务器端没有任何错误。
有没有办法覆盖端点GET/api/v1/ticketBundles/{id}/notes
,而不使用自定义控制器,通过Repository
公开它(使用它我会丢失设施来管理Pageable)?
此外,在上面显示的电话中获取HTTP 404我做错了什么?
答案 0 :(得分:0)
我相信您使用的是不正确的注释。您需要使用@RestController
为您的课程添加注释,并在您的方法上使用@PathVariable
而不是@Param
。这是一个工作样本,您可能希望根据您的需要进行定制。
@org.springframework.data.rest.webmvc.RepositoryRestController
@org.springframework.web.bind.annotation.RestController
public interface PersonRepository extends org.springframework.data.repository.PagingAndSortingRepository<Person, Long> {
@org.springframework.web.bind.annotation.GetMapping(path = "/people/{id}")
Person findById(@org.springframework.web.bind.annotation.PathVariable("id") Long id);
}