首页 > 解决方案 > 使用 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

请帮帮我。

标签: javaspringjparabbitmqpostman

解决方案


推荐阅读