gpt4 book ai didi

Spring如何解析@RepositoryRestController中的实体uri

转载 作者:行者123 更新时间:2023-12-02 05:26:21 25 4
gpt4 key购买 nike

我正在使用 Spring boot 1.5.3、Spring Data REST、Spring HATEOAS。 Spring Data REST 非常棒并且做得很完美,但有时它需要自定义业务逻辑,因此我需要创建一个自定义 Controller 。

我将使用 @RepositoryRestController 来受益于 Spring Data REST 功能 ( http://docs.spring.io/spring-data/rest/docs/current/reference/html/#customizing-sdr.overriding-sdr-response-handlers )。

因为 Spring Data REST 默认使用 HATEOAS,所以我正在使用它。我需要一个像这样的 Controller :

@RepositoryRestController
@RequestMapping(path = "/api/v1/workSessions")
public class WorkSessionController {

@Autowired
private EntityLinks entityLinks;

@Autowired
private WorkSessionRepository workSessionRepository;

@Autowired
private UserRepository userRepository;

@PreAuthorize("isAuthenticated()")
@RequestMapping(method = RequestMethod.POST, path = "/start")
public ResponseEntity<?> start(@RequestBody(required = true) CheckPoint checkPoint) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();

if (checkPoint == null) {
throw new RuntimeException("Checkpoint cannot be empty");
}

if (workSessionRepository.findByAgentUsernameAndEndDateIsNull(auth.getName()).size() > 0) {
// TODO return exception
throw new RuntimeException("Exist a open work session for the user {0}");
}

// ...otherwise it's opened a new work session
WorkSession workSession = new WorkSession();
workSession.setAgent(userRepository.findByUsername(auth.getName()));
workSession.setCheckPoint(checkPoint);
workSession = workSessionRepository.save(workSession);

Resource<WorkSession> resource = new Resource<>(workSession);
resource.add(entityLinks.linkFor(WorkSession.class).slash(workSession.getId()).withSelfRel());
return ResponseEntity.ok(resource);
}
}

因为参数 CheckPoint 必须是现有资源,所以我希望客户端发送资源的链接(就像您可以在 Spring Data REST POST 方法中所做的那样)。不幸的是,当我尝试这样做时,服务器端我收到一个空的 CheckPoint 对象。

我已经读过Resolving entity URI in custom controller (Spring HATEOAS)converting URI to entity with custom controller in spring data rest?特别是Accepting a Spring Data REST URI in custom controller .

我想知道是否有最佳实践来避免将 id 暴露给客户端,遵循 HATEOAS 原则。

最佳答案

尝试像这样更改 Controller :

@RepositoryRestController
@RequestMapping(path = "/checkPoints")
public class CheckPointController {

//...

@Transactional
@PostMapping("/{id}/start")
public ResponseEntity<?> startWorkSession(@PathVariable("id") CheckPoint checkPoint) {

//...
}
}

这意味着:“对于具有给定 ID 的 CheckPoint 启动新的 WorkSession”。您的 POST 请求将类似于:localhost:8080/api/v1/checkPoints/1/start

关于Spring如何解析@RepositoryRestController中的实体uri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44735750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com