使用POST方法

时间:2017-04-25 14:23:03

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

我有两个实体,User和Operation,两个实体之间都有一个连接:

@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

}

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

在我的上下文中,当用户(操作员)被记录时,用户实体在会话范围(HttpSession)中加载。 对于系统上用户的每个操作,app通过Operation Repository注册该操作。

我的问题是:如何在数据库中的寄存器之前将用户实体(进行会话)设置为操作?

是否可以覆盖Repository方法?

编辑1:

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

URI:http:// localhost:9874 / operations DATA:{" name":" operation-name" }

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以创建一个预存储事件处理程序,您可以在其中设置关联:然后您可以将标准的Spring Data Rest帖子发送到http://localhost:9874/operations,而不需要自定义存储库或控制器。

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) {

  }
}

您说用户存储在会话中。我接受你那么你没有使用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); 
  }
}

答案 1 :(得分:0)

创建自定义存储库接口并为其编写实现。例如。

public interface OperationRepositoryCustom {

  <T extends Operation> T saveCustomized(Operation operation);
}

您的实现类看起来像这样。

public class OperationRepositoryImpl implements OperationRepositoryCustom{
  //You can autowire OperationRepository and other dependencies 

  @Autowired
  OperationRepository operationRepository;  

  @Override
  public Operation saveCustomized(Operation operation) {
      //put your code to update operation with user and save it by calling operationRepository.save(). 
  }
}

请注意命名约定,即您的自定义实现需要与您的存储库+ Impl具有相同的名称。因此,如果您的存储库接口名为OperationRepository,则您的自定义存储库接口应为OperationRepositoryCustom,impl应命名为OperationRepositoryImpl

希望有所帮助