如何使用 POST 方法执行 findAllBy()?

How can I perform findAllBy() using POST method?

我被要求创建一个请求,根据他们的性别列出客户。但是请求方法必须是 POST 并且我被建议使用 dto 和映射器来实现这个目标。我会举一些例子来进一步解释我的问题。

我的客户实体如下:

@Data
@Entity
@Table(name = "customer", schema = "public")
public class Customer implements Serializable {
    @Id
    @Column(name = "id_", unique = true)
    private Integer id_;
    @Column(name = "name_", nullable = false)
    private String name_;
    @Column(name = "surname", nullable = false)
    private String surname;
    @Column(name = "phone", nullable = false)
    private String phone;
    @Column(name = "email", nullable = false)
    private String email;
    @Column(name = "gender", columnDefinition = "text", nullable = false)
    private String gender;
    @JsonBackReference
    @OneToMany(mappedBy = "customer")
    Set<PurchaseOrder> purchaseOrder = new HashSet();

    public Customer() {

    }

这是基于我的代码的客户流示例:

{
        "id_": 1,
        "name_": "Laura",
        "surname": "Blake",
        "phone": "95334567865",
        "email": "Bulvar 216 PF Changs",
        "gender": "W"
    }

我被要求将此流作为输入:

{ "gender": "W" }

作为输出,我预计会收到一份性别为 'W' 的客户实体列表。所以,我创建了一个 CustomerDto class:

@Data
public class CustomerDto {
    private String gender;
}

这是 CustomerRepository 中定义的我要使用的方法:

@Repository
public interface CustomerRepository extends JpaRepository<Customer, Integer> {

    List<Customer> findAllByGender(Customer customer);
}

这是我在控制器和服务上分别拥有的内容:

@RequestMapping(method= RequestMethod.POST, value="/customers/gender")
    public List<Customer> getCustomersByStream(@RequestBody @Valid Customer customer) {
        return service.getCustomersByGender(customer);
    }

public List<Customer> getCustomersByGender(Customer customer) {
        return repo.findAllByGender(customer);
    }

我将 ModelMapper 添加到我的依赖项中,并尝试了几种使用 customer 和 customerDto 输入的方法。但是我未能成功地按性别列出客户。我会很感激一个带有适当解释的代码答案,这样我就可以理解发生了什么。

编辑:

这是没有使用 ModelMapper 的答案。如果有人正在寻找解决方案:

控制器:

@RequestMapping(method= RequestMethod.POST, value="/customers/gender")
    public List<Customer> getCustomersByStream(@RequestBody @Valid CustomerDto dto) {
        String gender = dto.getGender();
        return service.getCustomersByGender(gender);
    }

存储库:

@Repository
public interface CustomerRepository extends JpaRepository<Customer, Integer> {

    List<Customer> findAllByGender(String gender);
}

服务:

public List<Customer> getCustomersByGender(String gender) {
        return repo.findAllByGender(gender);
    }

好吧,这很简单。

在你的控制器中

//Pass a parameter geneder = someValue and you will get that in the gender variable
@RequestMapping(method= RequestMethod.POST, value="/customers/gender")
public List<Customer> getCustomersByStream(@RequestBody AnotherDTO gender) {
    return service.getCustomersByGender(anotherDTO.getGender());
}

DTO 旨在用于接受具有大量数据负载的请求正文或用于转换自定义响应。因为我认为您的上司会要求使用 DTO 来自定义响应。只放置那些你想在响应中出现的变量。

ResponseDTO.java

public class CustomerDto {
    private String gender;
    private Long id;
    private String name;
    private String surname;
    private String phone;
    private String email;
    //Standard Setters and getters
    //Also, you need to make sure that the variable name in the Entity should 
    //be exactly same as your Entity. In DTO you just need to put those 
    //variables which you want to be in response.
}

你的回购

@Repository
public interface CustomerRepository extends JpaRepository<Customer, Integer> {

    List<Customer> findAllByGender(String gender);
}

您的业务层。一些Javaclass.

public List<Customer> getCustomersByGender(String gender) {
    List<Customer> response = new ArrayList<>();
    List<Customer> list = repo.findAllByGender(gender);
    //Autowire Object mapper of manually create a new instance.
    ObjectMapper mapper = new ObjectMapper();
    list.forEach(customer ->{
         YourDTO ref = mapper.map(list, YourDTO.class);
         response.add(ref);
    });
   return response;
}

现在,您可以简单地return您从服务层收到的响应。