首页 > 解决方案 > 获取 ItemRequestForm.java 的修改版本以在 DSpace 版本 6x 中工作

问题描述

我有一个ItemRequestForm.java以前在版本 5x 中工作的修改版本。在item-view.xsl中,我创建了一个链接,单击该链接会将用户重定向到此修改后的表单。此链接的 URL 模式是http://example.com/documentdelivery/123456789/1234. 当我将我的 DSpace 版本升级到 6x 时,我很难让它工作。由于版本 5 和 6 之间的主要代码重构,我发现很难将我的代码迁移到最新版本。

下面是在版本 5x ( DocumentDeliveryForm.java )中工作的部分代码

代码主要基于这个答案:如何从 DSpace 中的反馈页面的修改版本中获取引用页面(项目)的标题?

    String handle=parameters.getParameter("handle","unknown");
    DSpaceObject dso = HandleManager.resolveToObject(context, handle);
    if (!(dso instanceof Item)) {
        return;
    }
    Request request = ObjectModelHelper.getRequest(objectModel);
    boolean firstVisit=Boolean.valueOf(request.getParameter("firstVisit"));

    Item item = (Item) dso;

    // Build the item viewer division.
    Division documentdelivery = body.addInteractiveDivision("DocumentDelivery-form",
            contextPath+"/documentdelivery/"+parameters.getParameter("handle","unknown"),Division.METHOD_POST,"primary");

当我升级到版本 6 时,我发现它DSpaceObject dso = HandleManager.resolveToObject(context, handle)不再有效,所以我将其替换为DSpaceObject dso = handleService.resolveToObject(context, handle).

以下是将我的 5x 代码迁移到 6x 的尝试(结果:java.lang.NullPointerException)

    String handle=parameters.getParameter("handle","unknown");
    DSpaceObject dso = handleService.resolveToObject(context, handle);
    if (!(dso instanceof Item)) {
        return;
    }
    Request request = ObjectModelHelper.getRequest(objectModel);
    Item item = (Item) dso;

    // Build the item viewer division.
    Division documentdelivery = body.addInteractiveDivision("DocumentDelivery-form",
            request.getRequestURI() + "/documentdelivery/" + item.getHandle(), Division.METHOD_POST,"primary");

下面是导致 Handle is null 的另一种尝试

    Request request = ObjectModelHelper.getRequest(objectModel);
    String handle = request.getParameter("handle");
    DSpaceObject dso = handleService.resolveToObject(context, handle);
    if (!(dso instanceof Item)) {
        return;
    }
    boolean firstVisit=Boolean.valueOf(request.getParameter("firstVisit"));

    Item item = (Item) dso;

    // Build the item viewer division.
    Division documentdelivery = body.addInteractiveDivision("DocumentDelivery-form",
            contextPath+"/documentdelivery/"+parameters.getParameter("handle","unknown"),Division.METHOD_POST,"primary");

查看java stacktrace,它指向这行代码:DSpaceObject dso = handleService.resolveToObject(context, handle). 似乎未加载句柄的值。

我应该修改代码的哪一部分才能成功将用户重定向到http://example.com/documentdelivery/123456789/1234from http://example.com/handle/123456789/1234

哪个项目查看器分区的构造是正确的?

    Division documentdelivery = body.addInteractiveDivision("DocumentDelivery-form",
            request.getRequestURI() + "/documentdelivery/" + item.getHandle(), Division.METHOD_POST,"primary");

或者

    Division documentdelivery = body.addInteractiveDivision("DocumentDelivery-form",
            contextPath+"/documentdelivery/"+parameters.getParameter("handle","unknown"),Division.METHOD_POST,"primary");

提前致谢。

标签: javadspace

解决方案


最后,我设法让它工作。我还根据我之前的帖子在这里显示了其他元数据字段:Getting other metadata in ItemRequestForm in DSpace 6x

public void addBody(Body body) throws SAXException, WingException,
        UIException, SQLException, IOException, AuthorizeException
{
    Request request = ObjectModelHelper.getRequest(objectModel);

    // Build the item viewer division.
    Division documentdelivery = body.addInteractiveDivision("documentdelivery-form",
            contextPath+"/documentdelivery/"+parameters.getParameter("handle", "unknown"),Division.METHOD_POST,"primary");

    documentdelivery.setHead(T_head);

    String handle = parameters.getParameter("handle","unknown");
    DSpaceObject dso = handleService.resolveToObject(context, handle);
    Item item = (Item) dso;

    String citationDC = itemService.getMetadataFirstValue(item, "dc", "identifier", "citation", org.dspace.content.Item.ANY);
    String titleDC = item.getName();
    String title = "";
    if (citationDC != null && citationDC.length() > 0) {
        title = citationDC;
    } else {
        if (titleDC != null && titleDC.length() > 0)
            title = titleDC;
    }
    documentdelivery.addPara(title);

我还添加了必要的导入:

import org.dspace.content.service.ItemService;
import org.dspace.handle.factory.HandleServiceFactory;
import org.dspace.handle.service.HandleService;

我还添加了这些:

    private final transient ItemService itemService = ContentServiceFactory.getInstance().getItemService();
    private final transient HandleService handleService = HandleServiceFactory.getInstance().getHandleService();

推荐阅读