覆盖标准 Spring 数据 REST API
Override standart Spring Data REST API
我的应用程序中有一个实体 User
。 Spring Data REST 为我提供了标准端点:
`GET` /user
`GET` /user/<id>
`POST` /user
`PUT` /user
`PATCH` /user
`DELETE` /user/<id>
我需要覆盖 DELETE
端点不更改端点 url /user
的默认行为。如果我将以下内容添加到我的控制器:
@Controller
@RequestMapping("/user")
public class User {
@DeleteMapping("/{id}")
@CrossOrigin
public ResponseEntity<?> delete(@PathVariable("id") final String id) {
userService.delete(id); // in service I remove user with other
return ResponseEntity.ok().build();
}
// other custom endpoints
}
我发现其他标准 REST 端点不起作用 - 我总是收到 405 错误。所以,我的问题是——如何自定义这个端点而不影响其他端点? (我知道如何在 @RepositoryEventHandler
中执行此操作 - 但在我的情况下我应该避免这样做)
你读过这个吗:Overriding Spring Data REST Response Handlers?
@RepositoryRestController
@RequestMapping("/users") // or 'user'? - check this...
public class UserController {
@Autoware
private UserRepo userRepo;
@Transactional
@DeleteMapping("/{id}")
public ResponseEntity<?> delete(@PathVariable("id") String id) { // or Long id?..
// custom logic
return ResponseEntity.noContent().build();
}
}
但是如果你想添加额外的业务逻辑来删除进程你甚至不需要实现自定义控制器,你可以使用自定义 event handler:
@Component
@RepositoryEventHandler(User.class)
public class UserEventHandler {
@Autoware
private UserRepo userRepo;
@BeforeDeleteEvent
public void beforeDelete(User u) {
//...
if (/* smth. wrong */) throw new MyException(...);
}
}
我的应用程序中有一个实体 User
。 Spring Data REST 为我提供了标准端点:
`GET` /user
`GET` /user/<id>
`POST` /user
`PUT` /user
`PATCH` /user
`DELETE` /user/<id>
我需要覆盖 DELETE
端点不更改端点 url /user
的默认行为。如果我将以下内容添加到我的控制器:
@Controller
@RequestMapping("/user")
public class User {
@DeleteMapping("/{id}")
@CrossOrigin
public ResponseEntity<?> delete(@PathVariable("id") final String id) {
userService.delete(id); // in service I remove user with other
return ResponseEntity.ok().build();
}
// other custom endpoints
}
我发现其他标准 REST 端点不起作用 - 我总是收到 405 错误。所以,我的问题是——如何自定义这个端点而不影响其他端点? (我知道如何在 @RepositoryEventHandler
中执行此操作 - 但在我的情况下我应该避免这样做)
你读过这个吗:Overriding Spring Data REST Response Handlers?
@RepositoryRestController
@RequestMapping("/users") // or 'user'? - check this...
public class UserController {
@Autoware
private UserRepo userRepo;
@Transactional
@DeleteMapping("/{id}")
public ResponseEntity<?> delete(@PathVariable("id") String id) { // or Long id?..
// custom logic
return ResponseEntity.noContent().build();
}
}
但是如果你想添加额外的业务逻辑来删除进程你甚至不需要实现自定义控制器,你可以使用自定义 event handler:
@Component
@RepositoryEventHandler(User.class)
public class UserEventHandler {
@Autoware
private UserRepo userRepo;
@BeforeDeleteEvent
public void beforeDelete(User u) {
//...
if (/* smth. wrong */) throw new MyException(...);
}
}