拉取请求不更新存储库
Pull Request Doesn't update repository
我正在尝试通过使用以下代码发送以下请求来更改 PerfilRepository 中的 Perfil 对象:
package br.com.bandtec.projetocaputeam.controller;
import br.com.bandtec.projetocaputeam.dominio.*;
import br.com.bandtec.projetocaputeam.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("/caputeam")
public class CaputeamController {
//USER CLASS
public abstract class Perfil {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "nome")
@NotNull
@Size(min = 5,max = 30)
@Pattern(regexp = "^[a-zA-Z\s]*$", message = "Nome inválido! Digite apenas letras e espaçamento") //Permite apenas letras e espaço
private String nome;
@NotNull
@CPF
private String cpf;
@Column(name = "email")
@NotNull
@Email
private String email;
@NotNull
@Size(min = 5,max = 12)
private String senha;
private Integer telefone;
@DecimalMin("0")
@DecimalMax("5")
private Double avaliacao;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id_endereco")
private Endereco endereco;
@NotNull
private String tipoPerfil;
@OneToOne(cascade = CascadeType.ALL)
private Categoria categoriaAutonomo;
//Getters
public Integer getId() {
return id;
}
public String getNome() {
return nome;
}
public String getCpf() {
return cpf;
}
public String getEmail() {
return email;
}
public String getSenha() {
return senha;
}
public Integer getTelefone() {
return telefone;
}
public Double getAvaliacao() {
return avaliacao;
}
public Endereco getEndereco() {
return endereco;
}
public String getTipoPerfil() {
return tipoPerfil;
}
public Categoria getCategoriaAutonomo() {
return categoriaAutonomo;
}
//Setters
public void setTipoPerfil(String tipoPerfil) {
this.tipoPerfil = tipoPerfil;
}
public void setNome(String nome) {
this.nome = nome;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public void setEmail(String email) {
this.email = email;
}
public void setSenha(String senha) {
this.senha = senha;
}
public void setTelefone(Integer telefone) {
this.telefone = telefone;
}
public void setAvaliacao(Double avaliacao) {
this.avaliacao = avaliacao;
}
public void setEndereco(Endereco endereco) {
this.endereco = endereco;
}
public void setCategoriaAutonomo(Categoria categoriaAutonomo) {
this.categoriaAutonomo = categoriaAutonomo;
}
}
//--- 存储库
@Autowired
private PerfilService perfilService = new PerfilService();
//--- USUARIOS
@GetMapping("/usuarios")
public ResponseEntity getUsuario(){
return perfilService.getPerfisRepository();
}
@PostMapping("/cadastrar-usuario")
public ResponseEntity cadastrarUsuario(@RequestBody @Valid Perfil novoPerfil){
return perfilService.cadastrarUsuario(novoPerfil);
}
@PutMapping("/usuarios/{id}")
public ResponseEntity alterarUsuario(@RequestBody @Valid Perfil usuarioAlterado, @PathVariable int id){
return perfilService.alterarPerfil(usuarioAlterado,id);
}
这就是我更改 perfil 对象的方法
public ResponseEntity alterarPerfil(Perfil perfilAlterado, int id){
perfisRepository.findById(id).map(perfil -> {
perfil.setNome(perfilAlterado.getNome());
perfil.setEmail(perfilAlterado.getEmail());
perfil.setTelefone(perfilAlterado.getTelefone());
return ResponseEntity.ok().build();
});
return ResponseEntity.badRequest().body("Alteração inválida!");
}
我这样在邮递员中发送我的放置请求:
{
"id": 1,
"nome": "Beatriz Barros",
"cpf": "103.725.810-05",
"email": "bia@hotmail.com",
"senha": "121520",
"telefone": 1134577777,
"avaliacao": 4.9,
"endereco": {
"id": 1,
"cep": "03311111",
"bairro": "Vila Poeira",
"logradouro": "RuaFlor",
"numeroLogradouro": 7,
"complemento": null,
"uf": "sp",
"cidade": "SaoPaulo"
},
"tipoPerfil": "autonomo",
"categoriaAutonomo": {
"id": 1,
"nome": "Jardineiro",
"descricao": null
},
"precoAutonomo": 0.0
}
但它总是returns status 400 bad request!
我已经尝试只发送我想更改的字段(姓名、电子邮件和 phone),但它也没有用
我也试过用 ID 和不用 ID 发送都没有用
如何发送正确的请求?
好吧,这实际上就是你在做的事情。
perfisRepository.findById(id).map(perfil -> {
perfil.setNome(perfilAlterado.getNome());
perfil.setEmail(perfilAlterado.getEmail());
perfil.setTelefone(perfilAlterado.getTelefone());
return ResponseEntity.ok().build();
});
perfil -> { /* */ }
实际上是一个 lambda expression 或者换句话说:一个匿名方法。因此,您不是在 alterarPerfil
方法中返回,而是在匿名方法中返回。
我从未使用过 Spring,但通过阅读 docs,我认为 perfisRepository
正在实现 CrudRepository
接口。
正确的代码应该是这样的:
Perfil oldObject = perfisRepository.findById(id).get();
if(oldObject == null) return ResponseEntity.badRequest().body("Alteração inválida!");
oldObject.setNome(perfilAlterado.getNome());
oldObject.setEmail(perfilAlterado.getEmail());
/* and so on - you probably want to use reflection or a helping class to save you some time here */
// For a given entity, save will act as update too.
perfisRepository.save(oldObject);
return ResponseEntity.ok().build();
因为在您的代码中,您没有保留任何更改。
我正在尝试通过使用以下代码发送以下请求来更改 PerfilRepository 中的 Perfil 对象:
package br.com.bandtec.projetocaputeam.controller;
import br.com.bandtec.projetocaputeam.dominio.*;
import br.com.bandtec.projetocaputeam.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("/caputeam")
public class CaputeamController {
//USER CLASS
public abstract class Perfil {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "nome")
@NotNull
@Size(min = 5,max = 30)
@Pattern(regexp = "^[a-zA-Z\s]*$", message = "Nome inválido! Digite apenas letras e espaçamento") //Permite apenas letras e espaço
private String nome;
@NotNull
@CPF
private String cpf;
@Column(name = "email")
@NotNull
@Email
private String email;
@NotNull
@Size(min = 5,max = 12)
private String senha;
private Integer telefone;
@DecimalMin("0")
@DecimalMax("5")
private Double avaliacao;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id_endereco")
private Endereco endereco;
@NotNull
private String tipoPerfil;
@OneToOne(cascade = CascadeType.ALL)
private Categoria categoriaAutonomo;
//Getters
public Integer getId() {
return id;
}
public String getNome() {
return nome;
}
public String getCpf() {
return cpf;
}
public String getEmail() {
return email;
}
public String getSenha() {
return senha;
}
public Integer getTelefone() {
return telefone;
}
public Double getAvaliacao() {
return avaliacao;
}
public Endereco getEndereco() {
return endereco;
}
public String getTipoPerfil() {
return tipoPerfil;
}
public Categoria getCategoriaAutonomo() {
return categoriaAutonomo;
}
//Setters
public void setTipoPerfil(String tipoPerfil) {
this.tipoPerfil = tipoPerfil;
}
public void setNome(String nome) {
this.nome = nome;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public void setEmail(String email) {
this.email = email;
}
public void setSenha(String senha) {
this.senha = senha;
}
public void setTelefone(Integer telefone) {
this.telefone = telefone;
}
public void setAvaliacao(Double avaliacao) {
this.avaliacao = avaliacao;
}
public void setEndereco(Endereco endereco) {
this.endereco = endereco;
}
public void setCategoriaAutonomo(Categoria categoriaAutonomo) {
this.categoriaAutonomo = categoriaAutonomo;
}
}
//--- 存储库
@Autowired
private PerfilService perfilService = new PerfilService();
//--- USUARIOS
@GetMapping("/usuarios")
public ResponseEntity getUsuario(){
return perfilService.getPerfisRepository();
}
@PostMapping("/cadastrar-usuario")
public ResponseEntity cadastrarUsuario(@RequestBody @Valid Perfil novoPerfil){
return perfilService.cadastrarUsuario(novoPerfil);
}
@PutMapping("/usuarios/{id}")
public ResponseEntity alterarUsuario(@RequestBody @Valid Perfil usuarioAlterado, @PathVariable int id){
return perfilService.alterarPerfil(usuarioAlterado,id);
}
这就是我更改 perfil 对象的方法
public ResponseEntity alterarPerfil(Perfil perfilAlterado, int id){
perfisRepository.findById(id).map(perfil -> {
perfil.setNome(perfilAlterado.getNome());
perfil.setEmail(perfilAlterado.getEmail());
perfil.setTelefone(perfilAlterado.getTelefone());
return ResponseEntity.ok().build();
});
return ResponseEntity.badRequest().body("Alteração inválida!");
}
我这样在邮递员中发送我的放置请求:
{
"id": 1,
"nome": "Beatriz Barros",
"cpf": "103.725.810-05",
"email": "bia@hotmail.com",
"senha": "121520",
"telefone": 1134577777,
"avaliacao": 4.9,
"endereco": {
"id": 1,
"cep": "03311111",
"bairro": "Vila Poeira",
"logradouro": "RuaFlor",
"numeroLogradouro": 7,
"complemento": null,
"uf": "sp",
"cidade": "SaoPaulo"
},
"tipoPerfil": "autonomo",
"categoriaAutonomo": {
"id": 1,
"nome": "Jardineiro",
"descricao": null
},
"precoAutonomo": 0.0
}
但它总是returns status 400 bad request! 我已经尝试只发送我想更改的字段(姓名、电子邮件和 phone),但它也没有用
我也试过用 ID 和不用 ID 发送都没有用
如何发送正确的请求?
好吧,这实际上就是你在做的事情。
perfisRepository.findById(id).map(perfil -> {
perfil.setNome(perfilAlterado.getNome());
perfil.setEmail(perfilAlterado.getEmail());
perfil.setTelefone(perfilAlterado.getTelefone());
return ResponseEntity.ok().build();
});
perfil -> { /* */ }
实际上是一个 lambda expression 或者换句话说:一个匿名方法。因此,您不是在 alterarPerfil
方法中返回,而是在匿名方法中返回。
我从未使用过 Spring,但通过阅读 docs,我认为 perfisRepository
正在实现 CrudRepository
接口。
正确的代码应该是这样的:
Perfil oldObject = perfisRepository.findById(id).get();
if(oldObject == null) return ResponseEntity.badRequest().body("Alteração inválida!");
oldObject.setNome(perfilAlterado.getNome());
oldObject.setEmail(perfilAlterado.getEmail());
/* and so on - you probably want to use reflection or a helping class to save you some time here */
// For a given entity, save will act as update too.
perfisRepository.save(oldObject);
return ResponseEntity.ok().build();
因为在您的代码中,您没有保留任何更改。