Не удалось отобразить данные в моем представлении: исключение, оценивающее выражение SpringEL

#java #spring #spring-boot #spring-data #thymeleaf

#java #весна #spring-boot #spring-данные #thymeleaf

Вопрос:

Я создаю приложение bankin’а, используя Spring boot и thymeleaf, я сталкиваюсь со следующей ошибкой при попытке показать данные учетной записи: Вызвано: org.attoparser.Исключение ParseException: Исключение, оценивающее выражение SpringEL: «compte.codeCompte» (шаблон: «comptes» — строка 34, col 14)

Вот мой банковский контролер:

 import java.util.Arrays;
import java.util.Date;
import java.util.List;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.projets.bank.entities.Client;
    import com.projets.bank.entities.Compte;
    import com.projets.bank.entities.CompteEpargne;
    import com.projets.bank.metier.ServiceLayer;
    
    @Controller
    
    
    public class BankController 
    {
        @Autowired
        private ServiceLayer banque;
        
    @RequestMapping("/operation")
    
        public String index()
        {
            return "comptes";
        }
        
        @RequestMapping("/consulterCompte")
        public String consulterCompte(Model model, String codeCompte)
        {
            try
            {
                Compte cp = banque.consulterCompte(codeCompte);
                model.addAttribute("compte",cp);
            }
            catch(Exception e)
            {
                model.addAttribute("exception", e);
            }
            return "comptes";
    
        }
    
        
    
    }
 

comptes.html:

 <div class="card-body">
                    <div>
                        <label>Code: </label>
                        <label th:text="${compte.codeCompte}">Code: </label>
                    </div>
                    <div>
                        <label>Solde: </label>
                        <label th:text="${compte.solde}"> </label>
                    </div>
                    <div>
                        <label>Date de création: </label>
                        <label th:text="${compte.dateCreation}"> </label>
                    </div>
                    <div>
                        <label>Type: </label>
                        <label th:text="${compte.class.simpleName}"> </label>
                    </div>
                </div>
 

Compte.java:

 public abstract class Compte implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @Id
    private String codeCompte;
    
    private Date dateCreation;
    private double solde;
    
    @ManyToOne
    @JoinColumn(name="CODE_CLI")
    private Client client;
    
    @OneToMany(mappedBy="compte" )
    private Collection<Operation> operation;
    
    public Compte() {
        super();
    }
    public Compte(String codeCompte, Date dateCreation, double solde, Client client) {
        super();
        this.codeCompte = codeCompte;
        this.dateCreation = dateCreation;
        this.solde = solde;
        this.client = client;
    }
    public String getCodeCompte() {
        return codeCompte;
    }
    public void setCodeCompte(String codeCompte) {
        this.codeCompte = codeCompte;
    }
    public Date getDateCreation() {
        return dateCreation;
    }
    public void setDateCreation(Date dateCreation) {
        this.dateCreation = dateCreation;
    }
    public double getSolde() {
        return solde;
    }
    public void setSolde(double solde) {
        this.solde = solde;
    }
    public Client getClient() {
        return client;
    }
    public void setClient(Client client) {
        this.client = client;
    }
    public Collection<Operation> getOperation() {
        return operation;
    }
    public void setOperation(Collection<Operation> operation) {
        this.operation = operation;
    }
    
    
    
}
 

Заранее спасибо.

Ответ №1:

Потому что, когда вы получаете запрос «/ operation» или происходит исключение, вы не устанавливаете атрибут «compte» в модели.

Есть два решения. вы должны выбрать тот, который вам нужен.

  1. добавить атрибут в запрос get
     @RequestMapping("/operation")
    
        public String index(Model model)
        {
            model.addAttribute("compte",new Compte());
            return "comptes";
        }

        @RequestMapping("/consulterCompte")
        public String consulterCompte(Model model, String codeCompte)
        {
            try
            {
                Compte cp = banque.consulterCompte(codeCompte);
                model.addAttribute("compte",cp);
            }
            catch(Exception e)
            {
                model.addAttribute("exception", e);
                model.addAttribute("compte",new Compte());
            }
            return "comptes";
    
        }

 

Или

  1. добавьте th:if в html
 <div class="card-body" th:if="${compte != null}">
     <div>
          <label>Code: </label>
          <label th:text="${compte.codeCompte}">Code: </label>
     </div>
.... // omit other code

</div>