java - JPA 实体:javax.el.PropertyNotFoundException:在类型上找不到属性 [base64String]
问题描述
当我刚开始学习 Entity 和 JSP 时,我遇到了一个问题。
我有一个学生班;
package tosun;
import org.hibernate.annotations.Type;
import javax.persistence.*;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
@Entity
@Table(name = "students")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "user_id")
protected int id;
@Lob
@Type(type = "org.hibernate.type.BinaryType")
@Column(name = "image")
private byte[] base64Image;
@Column(name = "first_name")
protected String firstName;
@Column(name = "last_name")
protected String lastName;
@Column(name = "email", unique = true)
protected String email;
@Transient public String base64String;
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 int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public byte[] getBase64Image() {
return base64Image;
}
public void setBase64Image(byte[] base64Image) {
this.base64Image = base64Image;
}
@Transient
public void getBase64String() throws UnsupportedEncodingException {
if(this.base64Image != null){
this.base64String = new String(Base64.getEncoder().encode(getBase64Image()));
}
}
public Student(String firstName, String lastName, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public Student(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.email = "student@default.com";
}
public Student() {
}
}
还有一个控制器类,它创建一个请求并将其分派到 view_students.jsp 页面。
private void listStudents(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
StudentDAO studentDAO = new StudentDAO();
// Step 0: Add Data
List<Student> students = studentDAO.getStudentList();
request.setAttribute("list", students);
// Step 1: get request dispatcher
RequestDispatcher dispatcher = request.getRequestDispatcher("/view_students.jsp");
// Step 2: forward the request to JSP
dispatcher.forward(request, response);
}
<%@ page import="java.util.Base64" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<link rel="stylesheet" href="css/font-awesome.min.css">
<html>
<head>
<style>
.btn {
background-color: DodgerBlue;
border: none;
color: white;
padding: 12px 16px;
font-size: 16px;
cursor: pointer;
}
/* Darker background on mouse-over */
.btn:hover {
background-color: RoyalBlue;
}
</style>
<style>
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
table, th, td {
border: 1px solid black;
}
tr:nth-child(even) {
background-color: #dddddd;
}
</style>
<title>View Students</title>
</head>
<br>
<body>
<h2>Student Table Demo</h2>
<hr>
<form action="Controller" method="get" id="form1">
<br/>
<table border="1" >
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Email Address</th>
<th>Image</th>
<th>Actions</th>
</tr>
</thead>
<c:forEach var="tempStudent" items="${list}">
<c:url var="deleteLink" value="Controller">
<c:param name="command" value="DELETE" />
<c:param name="studentId" value="${tempStudent.id}" />
</c:url>
<tr>
<td>${tempStudent.firstName}</td>
<td>${tempStudent.lastName}</td>
<td>${tempStudent.email}</td>
<!-- <img src="data:image/jpg;base64,${image}" width="240" height="300"/> -->
<img src="data:image/jpg;base64,${tempStudent.base64String}" width="240" height="300"/>
<!-- <td><img src="data:image/jpeg;base64,${tempStudent}.base64String" alt="image"> </td> -->
<!-- <td><img src="${sessionScope.url}" width="240" height="300"/></td> -->
<!-- <img src="data:image/png;base64,${url}"> -->
<td>
<input type="submit" formmethod="post" name="buttonEdit" value="Edit" class='btn btn-default'>
<a href="${deleteLink}">Delete</a>
<form action="Controller" method="post" enctype="multipart/form-data" >
<input type="hidden" value="${tempStudent.id}" name="id" >
<input type="hidden" value="UPLOAD_IMAGE" name="command">
<input type="file" name="photo">
<input type="submit" value="upload"/>
</form>
<!---- <input type="submit" formmethod="get" onclick="location.href='${deleteLink}'" name="buttonDelete" value="Delete" class='btn btn-default'>
---->
</td>
</tr>
</c:forEach>
</table>
<br><br/>
</form>
<form action="student-form.jsp">
<input type="button" value="Create New Student" class='btn btn-default'
onclick="window.location.href='student-form.jsp'; return false;"/>
</form>
</body>
</html>
此工作返回错误如下所示;消息 javax.el.PropertyNotFoundException:在类型 [tosun.Student] 上找不到属性 [base64String]
说明 服务器遇到了阻止它完成请求的意外情况。
例外
org.apache.jasper.JasperException: javax.el.PropertyNotFoundException: 在类型 [tosun.Student] 上找不到属性 [base64String] org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:639) org.apache.jasper .servlet.JspServletWrapper.service(JspServletWrapper.java:515) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) javax .servlet.http.HttpServlet.service(HttpServlet.java:733) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) tosun.Controller.listStudents(Controller.java:123) tosun.Controller .doGet(Controller.java:64) javax.servlet.http.HttpServlet.service(HttpServlet.java:626) javax.servlet.http.HttpServlet.service(HttpServlet.java:733) org.apache.tomcat.websocket.server .WsFilter.doFilter(WsFilter.java:53)
我读到该建议是添加 @Transient 字段,但它不起作用。有什么想法或建议吗?谢谢。
解决方案
在我解决这个问题的经验之后,我注意到传递给 jsp 页面的对象必须包含在 jsp 代码中调用的每个属性的 getter 方法。它解决了我的问题。