我是Spring和JPA / Hibernate的新手,我脱掉了头发。
我正在制作一个CRUD应用程序。我有一个实体“用户”,一个存储库“UserRepository”和一个名为“UserController”的控制器。而且我正在使用MySQL。
当我执行POST请求时,我已成功创建User
(它们保存在MySQL数据库中)。不幸的是,当我尝试使用findOne()
UserRepository
方法检索用户时,我得到了null
。我的DELETE请求也失败了。
我现在已经在这个问题上待了几天。
这是我的User
实体:
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.Date;
@Entity
@Table(name = "user")
public class User {
@Id
private String email;
@NotNull
private String nomUtilisateur;
@NotNull
private Date dateInscription;
@NotNull
private long nbSoireeOrganisee;
@NotNull
private float noteGenerale;
public User(String aEmail, String aNomUtilisateur) {
email = aEmail;
nomUtilisateur = aNomUtilisateur;
dateInscription = new Date();
nbSoireeOrganisee = 0;
noteGenerale = 0;
}
public User() {
// Only JPA
}
public String getUserEmail() {
return email;
}
public String getUserName() {
return nomUtilisateur;
}
public Date getDateInscription() {
return dateInscription;
}
public long getNbSoireeOrganisee() {
return nbSoireeOrganisee;
}
public float getNoteGenerale() {
return noteGenerale;
}
@Override
public String toString() {
return String.format("User[name='%s']", this.nomUtilisateur);
}
}
那是我的UserRepository
:
import fr.afti.proto.fact.models.User;
import org.springframework.data.jpa.repository.JpaRepository;
import javax.transaction.Transactional;
@Transactional
public interface UserRepository extends JpaRepository<User, String> {
User findByNomUtilisateur(String nomUtilisateur);
}
这是我的UserController
:
import fr.afti.proto.fact.models.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@CrossOrigin
public class UserController {
@Autowired
private UserRepository userRepository;
// CREATE User
// This function works
@PostMapping("/create/{aEmail}/{aNomUtilisateur}")
public String create(@PathVariable String aEmail, @PathVariable String aNomUtilisateur) {
try {
User newUser = new User(aEmail, aNomUtilisateur);
userRepository.saveAndFlush(newUser);
} catch (Exception ex) {
return "Error when trying to create a user";
}
return "User successfully created";
}
// DELETE User
// This function doesn't work
@DeleteMapping("/delete/user/{email}")
public String delete(@PathVariable String email) {
userRepository.delete(email);
return "true";
}
// READ User
// This funcction doesn't work
@GetMapping("user/{email}")
public
@ResponseBody
String getUserByMail(@PathVariable String email) {
User uRes = userRepository.findOne(email); // THIS RETURN NULL
//User uRes = userRepository.findByNomUtilisateur("Toto");
return uRes.getUserName();
}
}
感谢您的帮助。
答案 0 :(得分:1)
您的代码有一些小问题:
email
属性为了使用其属性查询实体,它至少需要这些属性的getter。所以添加email
属性:
...
public String getUserEmail() {
return email;
}
...
GET
和DELETE
请求映射如果您向当前控制器发送GET
请求:
GET localhost:8080/user/test@example.com
Spring将最后一个.
字符后的所有内容视为文件扩展名,因此.com
将被截断,{email}
将设置为test@example
。
这就是getUserByMail
方法返回null
的原因。
你有几个选择:
@DeleteMapping("/delete/user/{email:.+}")
...
@GetMapping("user/{email:.+}")
...
例如:
@GetMapping("user")
public String getUserByMail2(@RequestParam("email") String email) {
User uRes = userRepository.findOne(email); // THIS RETURN NULL
return uRes.getUserName();
}
并使用:
调用它GET localhost:8080/user?email=test%40example.com
有关完整的工作示例,请参阅here。