如何使用 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您从服务层收到的响应。
我被要求创建一个请求,根据他们的性别列出客户。但是请求方法必须是 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您从服务层收到的响应。