最佳实践:Spring Boot后端和jQuery前端

时间:2018-08-30 11:55:08

标签: javascript java html json ajax

我目前正在使用Spring Boot 2后端和jQuery前端进行项目。因此,前端将Ajax请求发送到spring REST控制器以与数据库实体一起操作。

当通过那些ajax调用来创建具有外部链接的实体的实体时(例如,创建具有多个地址的人),我问自己,在考虑事务操作并减少冗余代码的同时,最佳做法是什么。

我已经考虑过这些可能性:

  1. 多个ajax调用 通过每个实体一个ajax调用创建链接的实体,并检查它们是否失败。如果失败,则删除所有创建的具有ajax调用的实体,例如手动回滚。似乎是一个非常糟糕的概念。

  2. 一个Ajax调用发送所有参数 进行一次ajax调用,为要创建的实体发送所有必需的参数。然后通过实体服务服务器端创建所有实体。但是如何在这里进行事务性操作?以及如何减少冗余代码?

预先感谢

2 个答案:

答案 0 :(得分:1)

首先,我需要知道您正在使用哪个数据库。如果您使用的是MongoDB,请忽略事务部分(除非您使用的是4.0版本和事务支持)。因此,我想您选择一个SQL数据库。

您问题的答案可能取决于前端如何处理数据。 对我来说,第一种选择无论如何都没有意义。 似乎您要么想包含所有地址,要么根本不包含任何地址,所以我将对所有地址进行一次请求,因为整个数据被视为不可分割的集合。

使用Hibernate和事务管理器可以轻松解决事务部分(只需注释将地址另存为@Transactional的方法即可)

我会这样实现:

控制器:

@RestController
@RequestMapping("/users")
public class UserController {

  @Autowired
  private UserService userService;

  @PostMapping("/{userId}/address")
  public List<Address> addAddress(@PathVariable String userId,
      @RequestBody AddressInsertRequest request){

    return userService.updateAddresses(userId, request.getAddresses());
  }

  //Externalize to oter class
  public class AddressInsertRequest {

    private List<Address> addresses;

    public List<Address> getAddresses() {
      return addresses;
    }

    public void setAddresses(List<Address> addresses) {
      this.addresses = addresses;
    }
  }
}

服务:

public class UserService {

  //TODO Implement with hibernate
  private UserRepository userRepository;

  @Transactional
  public List<Address> updateAddresses(String userId, List<Address> addressList){
    User user = userRepository.findById(userId);
    user.setAddressList(addressList);
    userRepository.save(user);
    return user.getAddressList();
  }
}

答案 1 :(得分:0)

您正确考虑事务性。正如您已经指出的那样,选项1是一种不好的方法,因为它需要手动执行rollbabck。选项2似乎是最合法的选择,但它需要您的后端来处理回滚。如果配置了正确的TransactionManager,这应该很容易。