使用Hibernate与JSP实现用户头像上传时遇错误求助
我看到你在开发用户档案的头像上传功能时遇到了问题,用Hibernate和JSP实现但提交表单后出现错误。先帮你梳理下问题并给出修复思路:
你的Servlet代码(add.java)
@WebServlet(name = "add", urlPatterns = {"/add"}) @MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, // 2MB maxFileSize = 1024 * 1024 * 10, // 10MB maxRequestSize = 1024 * 1024 * 50) public class add extends HttpServlet { public static final String UPLOAD_DIR = "resources"; PrintWriter out; HttpSession session; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { Session sessionh = HibernateUtil.getSessionFactory().openSession(); sessionh.beginTransaction(); try { out = response.getWriter(); session = request.getSession(); PasswordGen pG=newPasswordGen(8,ThreadLocalRandom.current()); // 语法问题 Part part = request.getPart("photo"); String photo = extractFileName(part); String path = UPLOAD_DIR + "/" + photo; String applicationPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIR; System.out.println("applicationPath: " + applicationPath); File fileUploadDirectory = new File(applicationPath); if (!fileUploadDirectory.exists()) { fileUploadDirectory.mkdirs(); } String savePath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIR + File.separator + photo; File fileSaveDir = new File(savePath); part.write(savePath + File.separator); // 路径处理错误 String password = pG.nextString(); Etudiant st = new Etudiant(); st.setPhoto(path); st.setPasswordEtudiant(password); // 缺少Etudiant其他必填属性设置 sessionh.save(st); sessionh.getTransaction().commit(); sessionh.close(); if (st != null) { session.setAttribute("username",st.getNomEtudiant()); // 属性可能为null session.setAttribute("image", path); session.setAttribute("email", st.getEmailEtudiant()); // 属性可能为null request.setAttribute("msg", "Etudiant ajouter"); request.getRequestDispatcher("addStudent.jsp").forward(request, response); } else { response.sendRedirect("error.jsp"); } } catch (ParseException ex) { Logger.getLogger(addStudent.class.getName()).log(Level.SEVERE, null, ex); // 缺少其他异常捕获 } } private String extractFileName(Part part) { String contentDisp = part.getHeader("content-disposition"); String[] items = contentDisp.split("; "); for (String s : items) { if (s.trim().startsWith("filename")) { return s.substring(s.indexOf("=") + 2, s.length() - 1); } } return ""; } }
错误截图

从截图的java.lang.NullPointerException错误来看,结合代码分析主要有以下几个问题及修复方案:
1. 表单未配置文件上传必需属性
文件上传的HTML表单必须添加enctype="multipart/form-data",否则request.getPart("photo")会返回null,后续调用part.getHeader()就会触发空指针异常。
修复:修改表单标签:
<form action="/add" method="post" enctype="multipart/form-data">
2. PasswordGen实例化语法错误
代码中newPasswordGen缺少空格,属于语法错误,会导致编译或运行时异常。
修复:修正为:
PasswordGen pG = new PasswordGen(8, ThreadLocalRandom.current());
3. 文件写入路径错误
part.write(savePath + File.separator);多添加了一个File.separator,savePath已经是完整的文件路径(目录+文件名),加上分隔符后会变成无效路径,导致写入失败。
修复:改为:
part.write(savePath);
4. Etudiant实体缺少必填属性设置
你只设置了photo和passwordEtudiant,但实体类中nomEtudiant、emailEtudiant等字段可能被标记为非空(比如@Column(nullable = false)),Hibernate保存时会抛出异常,后续调用这些属性也会返回null。
修复:从表单获取并设置所有必填属性:
// 示例:从表单获取参数 String nom = request.getParameter("nomEtudiant"); String email = request.getParameter("emailEtudiant"); Etudiant st = new Etudiant(); st.setPhoto(path); st.setPasswordEtudiant(password); st.setNomEtudiant(nom); st.setEmailEtudiant(email);
5. 异常处理范围不足
当前仅捕获ParseException,但文件上传、Hibernate操作可能抛出NullPointerException、IOException等其他异常,这些异常未被捕获会导致错误无法被正确记录。
修复:扩展异常捕获并确保Session资源释放:
} catch (ParseException | NullPointerException | IOException | HibernateException ex) { Logger.getLogger(add.class.getName()).log(Level.SEVERE, null, ex); response.sendRedirect("error.jsp"); } finally { if (sessionh != null && sessionh.isOpen()) { sessionh.close(); } }
按照以上步骤逐一排查修复,应该能解决当前的问题。如果还有其他细节问题,可以补充更多信息继续分析。
内容的提问来源于stack exchange,提问作者AbdElhamid Khelifa Karfa

