Spring JPA / Hibernate存储库findOne方法返回null

时间:2017-02-17 22:26:59

标签: java mysql spring hibernate jpa

我是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();
    }
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的代码有一些小问题:

1。添加email属性

为了使用其属性查询实体,它至少需要这些属性的getter。所以添加email属性:

...
public String getUserEmail() {
    return email;
}
...

2。修复您的GETDELETE请求映射

如果您向当前控制器发送GET请求:

GET localhost:8080/user/test@example.com

Spring将最后一个.字符后的所有内容视为文件扩展名,因此.com将被截断,{email}将设置为test@example

这就是getUserByMail方法返回null的原因。

你有几个选择:

2.1设置电子邮件路径变量的正则表达式模式:

@DeleteMapping("/delete/user/{email:.+}")
...

@GetMapping("user/{email:.+}")
...

2.1或使用请求参数而不是路径变量

例如:

@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