java - 使用 POST 方法在保存之前连接实体

标签 java spring-boot spring-data-rest spring-rest

我有两个实体,用户和操作,并且两个实体之间都有一个联接:

@Entity
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long userId;

    @Basic
    private String username;

    private String password;

    //Getters and Setters
}

@Entity
public class Operation implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long userId;

    @ManyToOne
    @JoinColumn(name = "user_id")
    User user;

    //Getters and Setters

}

两个实体也都有一个存储库。

在我的上下文中,当用户(运算符(operator))被记录时,用户实体被加载到 session 范围(HttpSession)中。 对于系统上用户的每个操作,应用程序都会通过操作存储库注册该操作。

我的问题是:如何在数据库注册之前将用户实体(进入 session )设置为操作?

是否可以重写存储库方法?

编辑1:

使用 HTTP POST 方法通过 Web 界面保存操作。我需要继续使用 URI 来保存。喜欢:

URI:http://localhost:9874/操作 数据:{“名称”:“操作名称”}

谢谢!

最佳答案

您可以创建一个预保存事件处理程序,在其中设置关联:然后您可以将标准 Spring Data Rest 发布到 http://localhost:9874/operations并且不需要自定义存储库或 Controller 。

http://docs.spring.io/spring-data/rest/docs/current/reference/html/#_writing_an_annotated_handler

@RepositoryEventHandler 
public class OperationEventHandler {

  @HandleBeforeSave
  public void handleOperationSave(Operation operation) {

  }
}

你说用户存储在 session 中。我想你没有使用 Spring Security 吗?如果是,那么您可以使用静态调用获取当前用户:

SecurityContextHolder.getContext().getAuthentication();

否则,您需要尝试将 HttpServletRequest 连接到您的事件处理程序,或使用静态包装器调用,如这些问题的答案中所述:

Spring: how do I inject an HttpServletRequest into a request-scoped bean?

从中你可以获得HttpSession。

下面显示了在这种情况下 HttpServletRequest 中的接线

Spring Data Rest - How to receive Headers in @RepositoryEventHandler

所以你的处理程序看起来像这样:

@RepositoryEventHandler 
public class OperationEventHandler {

  @Autowired
  private HttPServletRequest request;

  @HandleBeforeSave
  public void handleOperationSave(Operation operation) {

      User user = (User)request.getSession().getAttribute("userKey");
      operation.setUser(user); 
  }
}

关于java - 使用 POST 方法在保存之前连接实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43613373/

相关文章:

java - "LIKE a%"。如何在应用程序引擎上写这个?

java - Spring Data Rest 投影排序

grails - 是否可以将 GORM 与 Spring Data JPA 和 Rest 一起使用?

java - Android:从库运行用户指定的代码

java - 在 Web 应用程序中部署模块

javascript - Spring Boot 与 microsoft sql server 的多数据库配置

java - 服务器 B 上的进程文件(位于服务器 A 上)

spring - 放松 Spring Data REST 投影的安全性

java - 当试图用一个字符替换两个字符时,应用程序崩溃。它可以很好地替换一个字符

spring - 从返回 future 的服务创建 Mono/Flux 的正确方法