英文:
Getting a modified version of ItemRequestForm.java to work in DSpace version 6x
问题
我有一个经过修改的 ItemRequestForm.java
版本,在 5x 版本中之前运行正常。在 item-view.xsl
中,我创建了一个链接,当用户点击时,会将用户重定向到这个修改过的表单。这个链接的 URL 模式是 http://example.com/documentdelivery/123456789/1234
。当我将 DSpace 版本升级到 6x 时,我在使它正常工作方面遇到了困难。由于版本 5 和 6 之间进行了重大的代码重构,我发现很难将我的代码迁移到最新版本。
下面是在 5x 版本中工作的部分代码(DocumentDeliveryForm.java)
该代码主要基于这个答案:How can I get the title of the referring page (item) from a modified version of feedback page in 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 为 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 堆栈跟踪,它指向这行代码:DSpaceObject dso = handleService.resolveToObject(context, handle)
。似乎 handle 的值没有被加载。
我应该修改代码的哪个部分,才能成功地将用户从 http://example.com/handle/123456789/1234
重定向到 http://example.com/documentdelivery/123456789/1234
?
哪种构建 item viewer division 的方式是正确的?
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");
提前感谢您的帮助。
英文:
I have a modified version of ItemRequestForm.java
that previously worked in version 5x. In item-view.xsl
, I created a link that when clicked, will redirect the user to this modified form. The URL pattern of this link is http://example.com/documentdelivery/123456789/1234
. When I upgrade my DSpace version to 6x, I have difficulty in making it work. Due to major code refactoring between versions 5 and 6, I find it hard to migrate my code to the latest version.
Below is part of the code that worked in version 5x (DocumentDeliveryForm.java)
The code is mostly based on this answer: How can I get the title of the referring page (item) from a modified version of feedback page in 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");
When I upgrade to version 6, I found out that DSpaceObject dso = HandleManager.resolveToObject(context, handle)
no longer worked, so I replaced it with DSpaceObject dso = handleService.resolveToObject(context, handle)
.
Below is my attempt to migrate my 5x code to 6x (Result: 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");
Below is another attempt that resulted in 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");
Looking at the java stacktrace, it is pointing to this line of code: DSpaceObject dso = handleService.resolveToObject(context, handle)
. It seems that the value for handle is not being loaded.
What part of my code should I modify so that I can successfully redirect users to http://example.com/documentdelivery/123456789/1234
from http://example.com/handle/123456789/1234
?
Which construction of item viewer division is correct?
Division documentdelivery = body.addInteractiveDivision("DocumentDelivery-form",
request.getRequestURI() + "/documentdelivery/" + item.getHandle(), Division.METHOD_POST,"primary");
OR
Division documentdelivery = body.addInteractiveDivision("DocumentDelivery-form",
contextPath+"/documentdelivery/"+parameters.getParameter("handle","unknown"),Division.METHOD_POST,"primary");
Thanks in advance.
答案1
得分: 0
最终,我成功使它工作起来了。根据我之前在这里发布的帖子,我还显示了其他基于元数据字段:在 DSpace 6x 的 ItemRequestForm 中获取其他元数据
public void addBody(Body body) throws SAXException, WingException,
UIException, SQLException, IOException, AuthorizeException
{
Request request = ObjectModelHelper.getRequest(objectModel);
// 构建项目查看器部分。
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();
英文:
Finally, I managed to get it to work. I also displayed other metadata fields based on my previous post here: 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);
I also added the necessary imports:
import org.dspace.content.service.ItemService;
import org.dspace.handle.factory.HandleServiceFactory;
import org.dspace.handle.service.HandleService;
And also I added these:
private final transient ItemService itemService = ContentServiceFactory.getInstance().getItemService();
private final transient HandleService handleService = HandleServiceFactory.getInstance().getHandleService();
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论