为什么我的交易没有呈现? --React 和 Java

时间:2021-03-13 19:28:50

标签: java reactjs

我似乎无法弄清楚我的代码哪里出错了,导致我的应用程序无法完全呈现交易。我在 mySQL 和 React 中都仔细检查了我的变量,所以这不是变量问题。我不确定错误是否出在前端 (React) 方面,但我很确定确实如此。

这是我的 TransactionsList 代码:

function TransactionsList() {

 const [transactions, setTransactions] = useState([]);
 
 useEffect(() => {
   let username = AuthenticationService.getLoggedInUserName();
   TransactionDataService.retrieveAllTransactions(
     username
   ).then((transactions) => setTransactions([transactions]));
  }, []);
   
  return (
    <CardColumns style={{ padding: "20px" }}>
      {transactions.map((transaction) => (
        <TransactionCard transaction={transaction} />
      ))}
    </CardColumns>
  );
}

这是我的交易卡代码:

const username = AuthenticationService.getLoggedInUserName();

  TransactionDataService.retrieveTransaction(username, useState.id).then(
    (response) =>
      useState({
        accountName: response.data.accountName,
        transactionDate: response.data.transactionDate,
        transactionType: response.data.transactionType,
        depositCategory: response.data.depositCategory,
        withdrawalCategory: response.data.withdrawalCategory,
        transactionAmount: response.data.transactionAmount,
        notes: response.data.notes,
      })
  );
    

export default function TransactionCard(props) {
  const classes = useStyles();

  const [expanded, setExpanded] = useState(false);

  const handleExpandClick = () => {
    setExpanded(!expanded);
  };
 
 const { transaction } = props; 

//  const { data: transactions } = useSWR((url) =>
//    fetch(url).then((_) => _.json())
//  );
 
  const getTransactions = (url) => fetch(url).then((_) => _.json());

  const { data: transactions } = useSWR(
    `http://localhost:8080/jpa/users/${username}/transactions`,
    getTransactions
  );

  useEffect(() => {
    console.log(transactions);
  }, [transactions]);
 
  function handleEdit(id) {
    console.log("handle edit");
    alert("you clicked edit");
  }

  function handleDelete(id) {
    console.log("handle delete");
  }

  return (
    <>
      <Card className={classes.card}>
        <center>
          <CardHeader tag="h3">{transaction.accountName}</CardHeader>
          <CardText>{transaction.transactionType}</CardText>
          <CardText>
            {moment.utc(transaction.transactionDate).format("MMM-DD-YYYY")}
          </CardText>
          <CardText>{transaction.depositCategory}</CardText>
          <CardText>{transaction.withdrawalCategory}</CardText>
          <CardText>{"$" + parseFloat(transaction.transactionAmount)}</CardText>
        </center>

这是相关的Java代码:

@GetMapping("/jpa/users/{username}/transactions")
    public List<Transaction> getAllTransactions(@PathVariable String username) {
        return transactionJpaRepository.findByUsername(username);
    }

这是我做卷曲时的发现:

StatusCode        : 200        
StatusDescription :
Content           : [{"id":200
                    1,"usernam 
                    e":"Tim"," 
                    accountNam 
                    e":"BOA"," 
                    transactio 
                    nDate":"20 
                    21-03-13T0 
                    2:19:33.00 
                    0+00:00"," 
                    transactio 
                    nType":"de 
                    posit","de 
                    positCateg 
                    ory":"payr 
                    oll","with 
                    drawalCate 
                    gory":null 
                    ,"transact 
                    ionAmount" 
                    ...        
RawContent        : HTTP/1.1   
                    200        
                    Vary: Orig
                    in,Access- 
                    Control-Re 
                    quest-Meth 
                    od,Access- 
                    Control-Re 
                    quest-Head 
                    ers        
                    Transfer-E 
                    ncoding: 
                    chunked    
                    Keep-Alive 
                    :
                    timeout=60 
                    Connection 
                    :
                    keep-alive 
                    Content-Ty 
                    pe: applic 
                    ation/json 
                    Da...
Forms             : {}
Headers           : {[Vary, Or
                    igin,Acces 
                    s-Control- 
                    Request-Me 
                    thod,Acces 
                    s-Control- 
                    Request-He 
                    aders], [T
                    ransfer-En
                    coding,    
                    chunked],  
                    [Keep-Aliv 
                    e, timeout 
                    =60], [Con 
                    nection, k 
                    eep-alive] 
                    ...}       
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTM
                    LDocumentC
                    lass
RawContentLength  : 1387

这是我的 POJO:

@Entity
public class Transaction {
    
    @Id
    @GeneratedValue
    private long id;
    private String username;
    private String accountName;
    private Date transactionDate;
    private String transactionType;
    private String depositCategory;
    private String withdrawalCategory;
    private double transactionAmount;
    private String notes;

    protected Transaction() {
        
    }

    public Transaction(long id, String username, String accountName, Date transactionDate, String transactionType,
            String depositCategory, String withdrawalCategory, double transactionAmount, String notes) {
        super();
        this.id = id;
        this.username = username;
        this.accountName = accountName;
        this.transactionDate = transactionDate;
        this.transactionType = transactionType;
        this.depositCategory = depositCategory;
        this.withdrawalCategory = withdrawalCategory;
        this.transactionAmount = transactionAmount;
        this.notes = notes;
    }


    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAccountName() {
        return accountName;
    }

    public void setAccountName(String accountName) {
        this.accountName = accountName;
    }

    public Date getTransactionDate() {
        return transactionDate;
    }

    public void setTransactionDate(Date transactionDate) {
        this.transactionDate = transactionDate;
    }

    public String getTransactionType() {
        return transactionType;
    }

    public void setTransactionType(String transactionType) {
        this.transactionType = transactionType;
    }

    public String getDepositCategory() {
        return depositCategory;
    }

    public void setDepositCategory(String depositCategory) {
        this.depositCategory = depositCategory;
    }

    public String getWithdrawalCategory() {
        return withdrawalCategory;
    }

    public void setWithdrawalCategory(String withdrawalCategory) {
        this.withdrawalCategory = withdrawalCategory;
    }

    public double getTransactionAmount() {
        return transactionAmount;
    }

    public void setTransactionAmount(double transactionAmount) {
        this.transactionAmount = transactionAmount;
    }

    public String getNotes() {
        return notes;
    }

    public void setNotes(String notes) {
        this.notes = notes;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (int) (id ^ (id >>> 32));
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Transaction other = (Transaction) obj;
        if (id != other.id)
            return false;
        return true;
    }
}

一旦我跨过 transactionJpaRepository.findByUsername(username),调试就会揭示这一点: "Hibernate:选择transactio0_.id 作为id1_1_,transactio0_.account_name 作为account_2_1_,transactio0_.deposit_category 作为deposit_3_1_,transactio0_.notes 作为notes4_1_,transactio0_.transaction_amount 作为transact5_1_,transaction_0_.transaction_amount 作为transact5_1_,transaction_0_.transaction_amount 作为transact5_1_,transaction_0.transaction 作为_1_transaction_0.transaction_1_,transaction_0_.deposit_category 作为username8_1_, transactio0_.withdrawal_category 作为withdraw9_1_ from transaction transactio0_ where transactio0_.username=?"

1 个答案:

答案 0 :(得分:1)

要遵循的代码很多,但是当我浏览这段代码时,有一点让我印象深刻...

您将状态管理的交易设置为这样的交易数组:

const [transactions, setTransactions] = useState([]);

然后你显然有一个本地对象从你的 TDS 承诺返回,称为“事务”,我猜它是一个数组。

TransactionDataService.retrieveAllTransactions(username)
.then((transactions) => setTransactions([transactions]));

所以,如果这一切都是真的,那么这里的状态驱动 setTransactions 调用将获取 Promise-Returned 数组并将其包装到单个数组元素中...

因此,您在此之后的状态驱动交易将如下所示:

transactions = [
   [ tx1, tx2, tx3, .... ]
]

在这种情况下,您的状态驱动事务对象中只有一条记录是有意义的。虽然那一条记录应该是所有交易的数组..

如果是这种情况,解决方案是修复您的 setTransactions 以不让 [] 包装您的承诺返回的交易数组。

也就是说,阅读评论确实听起来像 curl/后端需要在你点击这个之前解决。