java - 使用 Spring JPA 通过会话登录后获取数据
问题描述
我试图在登录后获取数据,但我的邮递员只返回1
并且在日志中没有显示任何内容。请看一下我的代码
用户模型
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id_nasabah;
@Column(name = "fullname")
private String name;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "payment")
private int payment;
}
//Getter Setter Constructor
会话类
public class Session {
private String username;
private String password;
private Boolean session;
}
//Getter Setter
用户接口
@RestController
@RequestMapping("/api")
public class NasabahAPI {
APISend send = new APISend();
APIReceive recv = new APIReceive();
@PostMapping("/login")
public ResponseEntity<?> doLogin (@RequestBody Nasabah nb) {
try {
send.doLogin(new Gson().toJson(nb));
} catch (Exception e) {
System.out.println("ERROR LOGIN: " + e);
}
return new ResponseEntity<>("Success Login!", HttpStatus.OK);
}
@GetMapping("/home")
public ResponseEntity<?> getPayment() {
try {
send.getData();
recv.receiveFromDB();
} catch (Exception e) {
System.out.println("ERROR GET DATA: " + e);
}
return new ResponseEntity<>(recv.getUser(), HttpStatus.OK);
}
}
API发送
public class APISend {
public void doLogin(String loginStr) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection con = factory.newConnection();
Channel channel = con.createChannel()) {
channel.queueDeclare("doLogin", false, false, false, null);
channel.basicPublish("", "doLogin", null, loginStr.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] SEND LOGIN: '" + loginStr + "'");
}
}
public void getSaldo() throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection con = factory.newConnection();
Channel channel = con.createChannel()) {
channel.queueDeclare("getData", false, false, false, null);
System.out.println(" [x] SEND GET DATA ");
}
}
}
数据库接收
public class DBReceive {
private ConnectionFactory factory;
private Connection connection;
private Channel channel;
private EntityManager entityManager;
private NasabahDAO naDao;
private final List<Session> session = new ArrayList<>();
private Boolean loginStatus = false;
DBSend send = new DBSend();
public void con() {
this.entityManager = Persistence
.createEntityManagerFactory("user-unit")
.createEntityManager();
naDao = new NasabahDAO(entityManager);
try {
entityManager.getTransaction().begin();
} catch (IllegalStateException e) {
entityManager.getTransaction().rollback();
}
}
public void com() {
try {
entityManager.getTransaction().commit();
entityManager.close();
} catch (IllegalStateException e) {
entityManager.getTransaction().rollback();
}
}
public void connectRabbitMQ() throws IOException, TimeoutException {
factory = new ConnectionFactory();
factory.setHost("localhost");
connection = factory.newConnection();
}
public void doLogin() {
try {
connectRabbitMQ();
channel = connection.createChannel();
channel.queueDeclare("doLogin", false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String loginStr = new String(delivery.getBody(), StandardCharsets.UTF_8);
System.out.println(" [x] Received '" + loginStr + "'");
con();
Nasabah user = new Gson().fromJson(loginStr, Nasabah.class);
naDao.findUser(loginStr);
for (Session obj: session) {
if (obj.getUsername().equals(user.getUsername()) && obj.getPassword().equals(user.getPassword())) {
loginStatus = true;
obj.setSession(true);
break;
}
}
com();
};
channel.basicConsume("doLogin", true, deliverCallback, consumerTag -> { });
} catch (Exception e) {
System.out.println("ERROR LOGIN = " + e);
}
}
public void getData() {
try {
connectRabbitMQ();
channel = connection.createChannel();
channel.queueDeclare("getData", false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
con();
for (Session obj: session) {
if (obj.getSession()) {
try {
List<User> user = naDao.getData();
send.sendToAPI(new Gson().toJson(user));
} catch ( Exception e ) {
System.out.println("Error send Data = " + e);
}
}
}
com();
};
channel.basicConsume("getData", true, deliverCallback, consumerTag -> { });
} catch (Exception e) {
System.out.println("ERROR GET SALDO = " + e);
}
}
}
用户DAO
public class UserDAO {
private EntityManager entityManager;
private EntityTransaction entityTransaction;
Nasabah query;
public UserDAO(EntityManager entityManager) {
this.entityManager = entityManager;
this.entityTransaction = this.entityManager.getTransaction();
}
public User findUser(String userStr) {
try {
User nb = new Gson().fromJson(userStr, User.class);
query = entityManager.createQuery("SELECT n FROM User n WHERE n.username='" + nb.getUsername() + "'", User.class).getSingleResult();
} catch (Exception e) {
System.out.println("ERROR find user " + e);
}
return query;
}
public List<User> getData() {
System.out.println("atas getdata");
return entityManager.createQuery("SELECT payment FROM User", User.class).getResultList();
}
}
数据库发送
public class DBSend {
public void sendToAPI (String nb) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare("sendData", false, false, false, null);
channel.basicPublish("", "sendData", null, nb.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] Sent '" + nb + "'");
} catch (Exception e) {
System.out.println("ERROR sendToAPI" + e);
}
}
}
API接收
public class APIReceive {
String user;
public void receiveFromDB() throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare("sendData", false, false, false, null);
System.out.println(" [*] Waiting for messages from database");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
this.nasabah = message;
};
channel.basicConsume("sendData", true, deliverCallback, consumerTag -> { });
}
public String getUser() {
return this.user;
}
}
流程是:
UserAPI --> APISend --> DBReceive--> UserDao --> DBReceive --> DBSend --> APIReceive
请帮帮我。
解决方案
推荐阅读
- excel - 从日期下周五返回的函数
- javascript - 如何使用 admin sdk 将文件上传到具有路径的 firebase 的云存储?
- mybatis - 使用Mybatis时,遇到avaticaSqlexception。有谁知道原因?
- php - php中使用ajax创建基于数据库数组元素的html表
- c# - Powershell 如何知道在哪里可以找到要导入的模块?
- vue.js - 在调整屏幕大小之前,无法使用 VueJs 和传单在 DIV 上显示所有地图
- javascript - 如何在不刷新整个页面的情况下将数据加载到页面的特定部分 php-codeigniter
- javascript - Javascript 让自定义 async 和 await 函数正常工作
- pdf - 从pdf电路示意图文件中提取对象的内容
- dart - 如何在同一个包上混合多个构建器?