Java 重写Spring数据Rest POST方法

Java 重写Spring数据Rest POST方法,java,spring-data,spring-data-jpa,spring-data-rest,Java,Spring Data,Spring Data Jpa,Spring Data Rest,我需要为POST方法添加额外的业务逻辑。现在,我将重用RepositoryEntityController中的逻辑来获取和保存所需的对象 @RepositoryRestController @RequestMapping("/customPost") public class UserController implements ApplicationEventPublisherAware { private final UserRepository userRepository; privat

我需要为POST方法添加额外的业务逻辑。现在,我将重用RepositoryEntityController中的逻辑来获取和保存所需的对象

@RepositoryRestController
@RequestMapping("/customPost")
public class UserController implements ApplicationEventPublisherAware {

private final UserRepository userRepository;
private final RepositoryRestConfiguration config;
private final HttpHeadersPreparer headersPreparer;
private ApplicationEventPublisher publisher;

@Autowired
public UserController(UserRepository userRepository, RepositoryRestConfiguration config, HttpHeadersPreparer headersPreparer) {
    this.userRepository = userRepository;
    this.config = config;
    this.headersPreparer = headersPreparer;
}

public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
    this.publisher = publisher;
}

@ResponseBody
@RequestMapping(
        value = {"/{repository}"},
        method = {RequestMethod.POST}
)
public ResponseEntity<ResourceSupport> postCollectionResource(PersistentEntityResource payload, PersistentEntityResourceAssembler assembler, @RequestHeader(value = "Accept", required = false) String acceptHeader) throws HttpRequestMethodNotSupportedException {
    return this.createAndReturn(payload.getContent(), assembler, this.config.returnBodyOnCreate(acceptHeader));
}

private ResponseEntity<ResourceSupport> createAndReturn(Object domainObject, PersistentEntityResourceAssembler assembler, boolean returnBody) {
    publisher.publishEvent(new BeforeCreateEvent(domainObject));
    Object savedObject = userRepository.save((User) domainObject);
    publisher.publishEvent(new AfterCreateEvent(savedObject));
    PersistentEntityResource resource = returnBody ? assembler.toFullResource(savedObject) : null;
    HttpHeaders headers = headersPreparer.prepareHeaders(resource);
    addLocationHeader(headers, assembler, savedObject);
    return ControllerUtils.toResponseEntity(HttpStatus.CREATED, headers, resource);
}

private void addLocationHeader(HttpHeaders headers, PersistentEntityResourceAssembler assembler, Object source) {
    String selfLink = assembler.getSelfLinkFor(source).getHref();
    headers.setLocation((new UriTemplate(selfLink)).expand(new Object[0]));
}

}

问题是:在不添加“/customPost”映射的情况下,我如何能够拥有所需的逻辑?

Spring数据REST在处理实体时会发出自己的数据:

  • 事件发生前
  • 后创建事件
  • 事件发生前
  • 余震
  • BeforeLinkSaveEvent
  • AfterLinkSaveEvent
  • 事件发生前
  • 后删除事件
您可以监听这些事件来添加额外的业务逻辑。例如,要在SDR创建新的
用户(使用POST方法)或保存现有的
用户(使用PUT/PATCH方法)后执行,您可以使用这样的处理程序:

@Component
@RepositoryEventHandler 
public class UserEventHandler {

  private final UserServie userServie;

  public UserEventHandler(UserServie userServie) {
      this.userServie = userServie;
  }

  @HandleAfterCreate
  public void handleAfterCreateUser(User user) {
      userService.afterCreate(user)  
  }

  @HandleAfterSave
  public void handleAfterSaveUser(User user) {
      userService.afterSave(user)  
  }
}

注:如果我没弄错的话,SDR在当前交易之外发出这些事件,只是在启动之前或提交之后。在实现您的业务逻辑时,您需要考虑到这一点…

@CharStyleбббббббб希望这将有助于SDR…)
java.lang.NullPointerException: null
at org.springframework.data.rest.webmvc.config.RootResourceInformationHandlerMethodArgumentResolver.resolveArgument(RootResourceInformationHandlerMethodArgumentResolver.java:86) ~[spring-data-rest-webmvc-2.6.10.RELEASE.jar:na]
at org.springframework.data.rest.webmvc.config.PersistentEntityResourceHandlerMethodArgumentResolver.resolveArgument(PersistentEntityResourceHandlerMethodArgumentResolver.java:113) ~[spring-data-rest-webmvc-2.6.10.RELEASE.jar:na]
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158) ~[spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128) ~[spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) ~[tomcat-embed-core-8.5.27.jar:8.5.27]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.27.jar:8.5.27]
@Component
@RepositoryEventHandler 
public class UserEventHandler {

  private final UserServie userServie;

  public UserEventHandler(UserServie userServie) {
      this.userServie = userServie;
  }

  @HandleAfterCreate
  public void handleAfterCreateUser(User user) {
      userService.afterCreate(user)  
  }

  @HandleAfterSave
  public void handleAfterSaveUser(User user) {
      userService.afterSave(user)  
  }
}