【问题标题】:I am working on a MVC Portlet and the document i am saving is not going to db我正在开发一个 MVC Portlet,我保存的文档不会进入 db
【发布时间】:2015-05-26 23:07:48
【问题描述】:

这是我的动作类,我必须将任何文档保存到数据库中,但它无法正常工作,并且在控制台中出现 NoSuchMethodException (javax.portlet.ActionRequest, javax.portlet.ActionResponse) 错误

package com.test.docupload;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.PortletException;

import com.liferay.counter.service.CounterLocalServiceUtil;
import com.liferay.portal.kernel.captcha.CaptchaMaxChallengesException;
import com.liferay.portal.kernel.captcha.CaptchaTextException;
import com.liferay.portal.kernel.captcha.CaptchaUtil;
import com.liferay.portal.kernel.dao.jdbc.OutputBlob;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.upload.UploadRequest;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;
import com.test.docup.model.Doc;
import com.test.docup.service.DocLocalServiceUtil;

/**
 * Portlet implementation class DocumentUploadAction
 */
public class DocumentUploadAction extends MVCPortlet {

    public void addDoc(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException, PortletException {

        UploadRequest uploadRequest = PortalUtil.getUploadPortletRequest(resourceRequest);
        File docImage = uploadRequest.getFile("doc");
        String title = ParamUtil.getString(uploadRequest, "firstName");
        InputStream fis = new FileInputStream(docImage);
        OutputBlob dataOutputBlob = new OutputBlob(fis, docImage.length());
        try {
            Doc doc = DocLocalServiceUtil.createDoc(CounterLocalServiceUtil.increment());
            doc.setDocName(title);
            doc.setOwner(10199);
            doc.setData(dataOutputBlob);
            doc = DocLocalServiceUtil.addDoc(doc);
            if (doc != null) {
                SessionMessages.add(resourceRequest.getPortletSession(), "document-added-success");
                System.out.println("document-added-success");

            } else {
                SessionErrors.add(resourceRequest.getPortletSession(), "document-added-failed");
                System.out.println("document-added-failed::");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这是我的jsp

<%@page import="com.liferay.portal.kernel.servlet.SessionMessages"%>
<%@ include file="init.jsp" %>

<c:if test='<%=SessionMessages.contains(renderRequest.getPortletSession(),"document-added-success")%>'>
    <liferay-ui:success key="document-added-success" message="Document has been added successfully." />
</c:if>

<c:if test='<%=SessionMessages.contains(renderRequest.getPortletSession(),"document-added-failed")%>'>
    <liferay-ui:error key="document-added-failed" message="Document Uploaded failed." />
</c:if>

<portlet:actionURL  var="addDocActionURL" name="addDoc"></portlet:actionURL>
<aui:form action="<%= addDocActionURL %>" method="post" name="fm" enctype="multipart/form-data">
    <aui:input name="title" value="" label="Doc Title"/>
    <aui:input  name="Doc" value="" type="file" label="Select Doc"/>
    <aui:button-row>
        <aui:button type="submit" />
    </aui:button-row>
</aui:form>

我已将ActionRequest 更改为ResourceRequest,但仍然无法正常工作。

【问题讨论】:

标签: liferay liferay-6


【解决方案1】:

您的代码中存在某些错误:

  1. 您忘记在 JSP 中包含 aui 的标记引用。

  2. 文件类型输入的属性名称是name="Doc",您在操作中获取的参数值是

文件 docImage = uploadRequest.getFile("doc");

视图和操作中的“Doc”/“doc”应该是一致的。

  1. 您使用 &lt;portlet:actionURL&gt; 标记创建了 URL,但将其链接到操作类型:

public void addDoc(ResourceRequest resourceRequest, ResourceResponse 资源响应) 抛出 IOException, PortletException {

这对使用&lt;portlet:resourceURL&gt; 标签创建的URL 有效。对于 actionURL,您的操作方法应该是:

public void addDoc(ActionRequest actionRequest, ActionResponse 动作响应) 抛出 IOException, PortletException {

  1. 将所有resourceRequest替换为actionRequest

  2. UploadRequest 应该是UploadPortletRequest

  3. 将您的操作类 &lt;portlet-class&gt; 链接到 portlet.xml 中的 JSP,如下所示,

com.test.docupload.DocumentUploadAction

所以,以下是更新后的代码:

Portlet.xml

<?xml version="1.0"?>

<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" 
             version="2.0">
    <portlet>
        <portlet-name>document</portlet-name>
        <display-name>Document Portlet</display-name>
        <portlet-class>com.test.docupload.DocumentUploadAction</portlet-class>
        <init-param>
            <name>view-template</name>
            <value>/view.jsp</value>
        </init-param>
        <expiration-cache>0</expiration-cache>
        <supports>
            <mime-type>text/html</mime-type>
        </supports>
        <portlet-info>
            <title>Document Portlet</title>
            <short-title>Document Portlet</short-title>
            <keywords>Document Portlet</keywords>
        </portlet-info>
        <security-role-ref>
            <role-name>administrator</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>guest</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>power-user</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>user</role-name>
        </security-role-ref>
    </portlet>
</portlet-app>

JSP:

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://alloy.liferay.com/tld/aui" prefix="aui" %>

<portlet:defineObjects />

<%@page import="com.liferay.portal.kernel.servlet.SessionMessages"%>
<%@ include file="init.jsp" %>

<c:if test='<%=SessionMessages.contains(renderRequest.getPortletSession(),"document-added-success")%>'>
    <liferay-ui:success key="document-added-success" message="Document has been added successfully." />
</c:if>

<c:if test='<%=SessionMessages.contains(renderRequest.getPortletSession(),"document-added-failed")%>'>
    <liferay-ui:error key="document-added-failed" message="Document Uploaded failed." />
</c:if>

<portlet:actionURL var="addDocActionURL" name="addDoc"></portlet:actionURL>
<aui:form action="<%= addDocActionURL %>" method="post" name="fm" enctype="multipart/form-data">
    <aui:input name="title" value="" label="Doc Title"/>
    <aui:input name="doc" value="" type="file" label="Select Doc"/>
    <aui:button-row>
        <aui:button type="submit" />
    </aui:button-row>
</aui:form>

DocumentUploadAction:

package com.test.docupload;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.PortletException;

import com.liferay.counter.service.CounterLocalServiceUtil;
import com.liferay.portal.kernel.captcha.CaptchaMaxChallengesException;
import com.liferay.portal.kernel.captcha.CaptchaTextException;
import com.liferay.portal.kernel.captcha.CaptchaUtil;
import com.liferay.portal.kernel.dao.jdbc.OutputBlob;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;

import com.liferay.portal.kernel.upload.UploadPortletRequest;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;

/**
 * Portlet implementation class DocumentUploadAction
 */
public class DocumentUploadAction extends MVCPortlet {

    public void addDoc(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException {

        UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(actionRequest);
        File docImage = uploadRequest.getFile("doc");
        String title = ParamUtil.getString(uploadRequest, "firstName");
        InputStream fis = new FileInputStream(docImage);
        OutputBlob dataOutputBlob = new OutputBlob(fis, docImage.length());
        try {
            Doc doc = DocLocalServiceUtil.createDoc(CounterLocalServiceUtil.increment());
            doc.setDocName(title);
            doc.setOwner(10199);
            doc.setData(dataOutputBlob);
            doc = DocLocalServiceUtil.addDoc(doc);
            if (true) {
                SessionMessages.add(actionRequest.getPortletSession(), "document-added-success");
                System.out.println("document-added-success");

            } else {
                SessionErrors.add(actionRequest.getPortletSession(), "document-added-failed");
                System.out.println("document-added-failed::");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

【讨论】:

  • @Prakash 谢谢你,有时我们甚至没有注意到,但我们犯了一些愚蠢的错误:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
相关资源
最近更新 更多