Spring Data Mysql在数据库中找不到名称



我是Spring Data Mysql的新手,我创建了一个小方法,让它从名称列表中给我一个名称,它会给我返回输入日期最早的名称。不幸的是,当我做得到它返回给我这个:

D:>curl -G localhost:8080/demo/first  -d name=Biagio
{"timestamp":"2020-10-02T09:29:33.704+00:00","status":404,"error":"Not Found","message

我都试过一点了,但到目前为止我还不能成功。以下是的方法和相关控制器

UserRepositoryImpl.java


package com.example.accessingdatamysql;



import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import org.springframework.stereotype.Component;
@Component
public class UserRepositoryImpl implements UserRepository {

private final EntityManager em;

public UserRepositoryImpl(EntityManager entityManager) {
this.em = entityManager;
}

@Override
public User findFirstByName(String name) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(User.class);
Root<User> root = criteria.from(User.class);
criteria.select(root).where(builder.equal(root.get("name"), name));
criteria.orderBy(builder.asc(root.get("timestamp")));
TypedQuery<User> query = em.createQuery(criteria).setMaxResults(1);
return query.getSingleResult();

}


@Override
//  per la creazione//
public void create(User entity) {
em.persist(entity); 
}

}

mainController.java

package com.example.accessingdatamysql;



import javax.persistence.NoResultException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller 
@RequestMapping(path="/demo") 
public class MainController {
@Autowired 

private UserRepository userRepository;
@Transactional
@PostMapping(path="/add")
public @ResponseBody String addNewUser (@RequestParam String name
, @RequestParam String email,@RequestParam String surname) 
{

User n = new User();
n.setName(name);
n.setSurname(surname);
n.setEmail(email);
userRepository.create(n);
return "Saved";
}



@GetMapping("/first")
User one(@RequestParam String name) {
System.out.print(name);
try { return userRepository.findFirstByName(name); 
} catch (NoResultException nre) { 
return null; } 
}
}

我为所有添加了User和UserRepository.java

User.java

package com.example.accessingdatamysql;
import java.sql.Timestamp;
import java.time.Instant;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity 
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;

public String name;
private String email;

private String surname;



@Column(name="stmp", columnDefinition = "TIMESTAMP (6)")
Timestamp timestamp = Timestamp.from(Instant.now());
public void setTimestamp(Timestamp timestamp) {
this.timestamp = timestamp;
}
public Timestamp getTimestamp() {
return timestamp;
}

public String getSurname() {
return surname;
}

public  void setSurname(String surname) {
this.surname = surname;
}

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}

UserRepository.java

package com.example.accessingdatamysql;


import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository {
User findFirstByName(String name);
void create(User entity);

}

编辑:我插入这个小项目引用的数据库:

+----+---------------------+--------+----------------------------+---------+
| id | email               | name   | stmp                       | surname |
+----+---------------------+--------+----------------------------+---------+
| 32 | mirketto90@yahoo.it | Mirko  | 2020-10-01 12:31:47.827000 | NULL    |
| 36 | biagio@gmail.com    | Biagio | 2020-10-01 16:31:31.687000 | Vaso    |
| 37 | biagio@gmail.com    | Biagio | 2020-10-01 16:31:50.077000 | Vaso    |
| 38 | biagio@gmail.com    | Biagio | 2020-10-01 18:35:45.992000 | Vaso    |
+----+---------------------+--------+----------------------------+---------+

我首先看到的是:

  • 您的/demo/first方法不是公共的
  • 调用此端点的正确方式应该是curl localhost:8080/demo/first?name=Biagio -H "Accept: application/json"

您应该能够使用浏览器验证端点localhost:8080/demo/first?name=Biagio,因为它默认提交GET请求。

我设法重现了这个问题,您应该删除类级映射,并在MainController:中提供该方法的完整路径

@RestController
public class MainController {
@Autowired
private UserRepository userRepository;
@Transactional
@PostMapping("/demo/add")
public @ResponseBody String addNewUser (
@RequestParam String name,
@RequestParam String email,
@RequestParam String surname) 
{
User n = new User();
n.setName(name);
n.setSurname(surname);
n.setEmail(email);
userRepository.create(n);
return "Saved";
}
@GetMapping("/demo/first")
public User one(@RequestParam String name) {
System.out.print(name);
return userRepository.findFirstByName(name); 
}
}

以下curl请求应成功:

curl -X GET localhost:8080/demo/first?name=Biagio
curl -G localhost:8080/demo/first?name=Biagio
curl -G localhost:8080/demo/first -d name=Biagio

更新
以下修复程序也在方法级映射中没有前导斜杠的情况下工作:

@Controller
@RequestMapping("/demo") // trailing slash optional, could be "/demo/"
public class MainController {
@Autowired
private UserRepository userRepository;
@Transactional
@PostMapping("add") // no leading slash
public @ResponseBody String addNewUser (/* ... */) {
// ...
}
@GetMapping("first") // no leading slash
public User one(@RequestParam String name) {
return userRepository.findFirstByName(name); 
}
}

最新更新