我发现了问题,请在下面回答:
原始问题: noob程序员在这里。 我正在开发一个openfire服务器项目,我们的团队正在尝试集成一个苹果推送通知服务插件。但是,我发现的插件在代码中有一些问题,jsp页面永远不会出现在openfire的管理控制台中。
经过数小时的手动调试(因为我完全不知道并且不知道apache的文件上传模块),我想出了这一行之间的问题:
List<FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
如果我禁用整个try子句,页面显示正常。当然,这意味着这个jsp页面将失去保存上传文件的能力。经过无数个小时的搜索,我发现什么都没有,所以我决定在这里问一下,试一试。
我真的不明白这条线路出了什么问题,eclipse给了我Type safety: The expression of type List needs unchecked conversion to conform to List<FileItem>
的警告,但插件编译并构建良好。语法对我来说也是正确的(谷歌搜索一段时间,看到人们也使用相同的语法)。 Openfire在调试时没用,在error.log或debug.log中没有记录任何有价值的信息。
如果有帮助,这是整个jsp文件。提前谢谢。
apns.jsp:
<%@ page import="java.io.File,
java.util.List,
org.jivesoftware.openfire.XMPPServer,
org.jivesoftware.util.*,
com.wecapslabs.openfire.plugin.apns.ApnsPlugin,
org.apache.commons.fileupload.FileItem,
org.apache.commons.fileupload.disk.DiskFileItemFactory,
org.apache.commons.fileupload.servlet.ServletFileUpload,
org.apache.commons.fileupload.FileUploadException"
errorPage="error.jsp"
%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<%-- Define Administration Bean --%>
<jsp:useBean id="admin" class="org.jivesoftware.util.WebManager" />
<c:set var="admin" value="${admin.manager}" />
<% admin.init(request, response, session, application, out ); %>
<% // Get parameters
boolean save = request.getParameter("save") != null;
boolean success = request.getParameter("success") != null;
boolean error = request.getParameter("error") != null;
String password = ParamUtils.getParameter(request, "password");
String badge = ParamUtils.getParameter(request, "badge");
String sound = ParamUtils.getParameter(request, "sound");
String production = ParamUtils.getParameter(request, "production");
ApnsPlugin plugin = (ApnsPlugin) XMPPServer.getInstance().getPluginManager().getPlugin("apns");
// Handle a save
if (save) {
plugin.setPassword(password);
plugin.setBadge(badge);
plugin.setSound(sound);
plugin.setProduction(production);
try {
List<FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : multiparts) {
if (!item.isFormField()) {
String filename = item.getName();
item.write(new File(ApnsPlugin.keystorePath()));
}
}
response.sendRedirect("apns.jsp?success=true");
return;
} catch (Exception e) {
response.sendRedirect("apns.jsp?error=true");
return;
}
}
password = plugin.getPassword();
badge = Integer.toString(plugin.getBadge());
sound = plugin.getSound();
production = plugin.getProduction() ? "true" : "false";
%>
<html>
<head>
<title>APNS Settings Properties</title>
<meta name="pageID" content="apns-settings"/>
</head>
<body>
<% if (success) { %>
<div class="jive-success">
<table cellpadding="0" cellspacing="0" border="0">
<tbody>
<tr><td class="jive-icon"><img src="images/success-16x16.gif" width="16" height="16" border="0"></td>
<td class="jive-icon-label">
APNS certificate updated successfully.
</td></tr>
</tbody>
</table>
</div><br>
<% } %>
<form action="apns.jsp?save" method="post" enctype="multipart/form-data">
<div class="jive-contentBoxHeader">APNS certificate</div>
<div class="jive-contentBox">
<label for="file">p12 certificate:</label>
<input type="file" name="file" />
<br>
<label for="password">certificate password:</label>
<input type="password" name="password" value="<%= password %>" />
<br>
<label for="badge">payload badge</label>
<input type="badge" name="badge" value="<%= badge %>" />
<br>
<label for="sound">payload sound</label>
<input type="badge" name="sound" value="<%= sound %>" />
<br>
<label for="production">sandbox or production</label>
<input type="radio" name="production" value="false" <%= production.equals("true") ? "" : "checked" %>>Sandbox
<input type="radio" name="production" value="true" <%= production.equals("true") ? "checked" : "" %>>Production
</div>
<input type="submit" value="Save">
</form>
</body>
</html>
答案 0 :(得分:0)
让我在这里回答我自己的问题 -
因为eclipse没有警告我导入问题,我认为插件需要的所有内容都包括在内,但事实并非如此。
因为openfire并没有真正告诉你出了什么问题,所以你不知道它只是一个缺失的导入。
因为插件无法通过maven openfire插件安装(作者停止支持插件...),我不得不手动将源文件链接到openfire源代码,并且不可避免地错过了maven为我们做的最重要的事情 - 依赖检查。
根据这篇文章,事实证明我所需要的只是commons-fileupload.jar和commons-io.jar: How to upload files to server using JSP/Servlet?
将文件放在{plugin-name} / lib,rebuild和voila中。