简体   繁体   中英

Failed to convert property value of type 'java.lang.String' to required type 'java.util.List' for property 'transactions'

I am working with thymeleaf and getting some errors regarding conversion of data from String to List. Here I have attached my code

My entity classes:

@Entity
@Table(name="customer")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;

@Column(name = "first_name")
@NotNull(message = "First Name cannot be empty")
@Size(min = 1, message = "First Name cannot be empty")
private String firstName;

@Column(name = "last_name")
@NotNull(message = "Last Name cannot be empty")
@Size(min = 1, message = "Last Name cannot be empty")
private String lastName;

@Column(name = "email")
@NotNull(message = "Email ID cannot be empty")
@Pattern(regexp = "^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+$",
        message = "Enter valid mail id")
private String email;

@Column(name = "branch")
@NotNull(message = "Branch name cannot be empty")
private String branch;

@Column(name = "balance")
private double balance;

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "customer_id")
private List<Transaction> transactions;

public Customer(String firstName, String lastName, String email, String branch, double balance) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
    this.branch = branch;
    this.balance = balance;
}

public Customer() {
}

public int getId() {
    return id;
}

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

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getBranch() {
    return branch;
}

public void setBranch(String branch) {
    this.branch = branch;
}

public double getBalance() {
    return balance;
}

public void setBalance(double balance) {
    this.balance = balance;
}

public List<Transaction> getTransactions() {
    return transactions;
}

public void setTransactions(List<Transaction> transactions) {
    this.transactions = transactions;
}

public void addTransaction(Transaction transaction){
    if(transaction == null) {
        transactions = new ArrayList<>();
    }
    transactions.add(transaction);
}

@Override
public String toString() {
    return "Customer{" +
            "id=" + id +
            ", firstName='" + firstName + '\'' +
            ", lastName='" + lastName + '\'' +
            ", email='" + email + '\'' +
            ", branch='" + branch + '\'' +
            ", balance=" + balance +
            '}';
  }


@Entity
@Table(name = "transactions")
public class Transaction {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;

@Column(name = "transaction")
private double amount;

public Transaction() {
}

public Transaction(double amount) {
    this.amount = amount;
}

public int getId() {
    return id;
}

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

public double getAmount() {
    return amount;
}

public void setAmount(double amount) {
    this.amount = amount;
}

@Override
public String toString() {
    return "Transaction{" +
            "id=" + id +
            ", amount=" + amount +
            '}';
}

Html Form:

    <h3>Customer Directory</h3>
    <hr>

    <p class="h4 mb-4">Save Customer</p>

    <form action="#" th:action="@{/customers/saveCustomer}"
          th:object="${customer}" method="POST">

        <!-- Add hidden form field to handle the update -->
        <input type="hidden" th:field="*{id}" />

        <input type="text" th:field="*{firstName}"
            class="form-control mb-4 col-4" placeholder="First Name">

        <input type="text" th:field="*{lastName}"
               class="form-control mb-4 col-4" placeholder="Last Name">

        <input type="text" th:field="*{email}"
               class="form-control mb-4 col-4" placeholder="Email">

        <input type="text" th:field="*{branch}"
               class="form-control mb-4 col-4" placeholder="Branch">

        <input type="text" th:field="*{balance}"
               class="form-control mb-4 col-4" placeholder="Balance">

        <input type="text" th:field="*{transactions}"
               class="form-control mb-4 col-4" placeholder="Transactions">

        <!--input type="hidden" th:field="*{transactions}" /-->

        <button type="submit" class="btn btn-info col-2">Save</button>

    </form>

    <hr>
    <a th:href="@{/customers/list}">Back to Customers List</a>

</div>

Error:

Validation failed for object='customer'. Error count: 1 org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors Field error in object 'customer' on field 'transactions': rejected value [[Transaction{id=1, amount=1000.0}, Transaction{id=3, amount=100.0}]]; codes [typeMismatch.customer.transactions,typeMismatch.transactions,typeMismatch.java.util.List,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [customer.transactions,transactions]; arguments []; default message [transactions]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.List' for property 'transactions'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.persistence.OneToMany @javax.persistence.JoinColumn com.kaneki.springboot.bankapplication.entity.Transaction] for value '[Transaction{id=1, amount=1000.0}, Transaction{id=3, amount=100.0}]'; nested exception is java.lang.NumberFormatException: For input string: "[Transaction{id=1, amount=1000.0}, Transaction{id=3, amount=100.0}]"]

Here from your HTML you are receiving the Transaction field as a string so in the controller you have to handle that string and extract id and amount from it and then set that id and amount to transaction table. Try this and if you have already tried or written that in your controller share the code of the controller.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM