我们正在尝试使用REST API构建一个应用程序,以提供在DSpace中提取的项目元数据的批量编辑。更新操作正在DSpace UI中反映出来。但是,除非我们运行索引发现,否则元数据在Solr中保持不变。由于我们打算使用大量数据,因此每次编辑元数据时运行索引发现都会很昂贵。有人可以为此建议解决方法/解决方案吗?
答案 0 :(得分:2)
您可以在REST端点的Java类中触发项更新。
例如: 在java类org.dspace.rest.ItemsResource的方法addItemMetadata中,它表示/ items REST端点,您可以在更改项元数据后添加以下行:
itemService.update(context, dspaceItem);
此行代码会触发该特定项目的索引更新。
这是完成addItemMetadata方法在上述更改后的样子:
@POST
@Path("/{item_id}/metadata")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response addItemMetadata(@PathParam("item_id") String itemId, List<org.dspace.rest.common.MetadataEntry> metadata,
@QueryParam("userIP") String user_ip, @QueryParam("userAgent") String user_agent,
@QueryParam("xforwardedfor") String xforwardedfor, @Context HttpHeaders headers, @Context HttpServletRequest request)
throws WebApplicationException
{
log.info("Adding metadata to item(id=" + itemId + ").");
org.dspace.core.Context context = null;
try
{
context = createContext();
org.dspace.content.Item dspaceItem = findItem(context, itemId, org.dspace.core.Constants.WRITE);
writeStats(dspaceItem, UsageEvent.Action.UPDATE, user_ip, user_agent, xforwardedfor, headers, request, context);
for (MetadataEntry entry : metadata)
{
// TODO Test with Java split
String data[] = mySplit(entry.getKey()); // Done by my split, because of java split was not function.
if ((data.length >= 2) && (data.length <= 3))
{
itemService.addMetadata(context, dspaceItem, data[0], data[1], data[2], entry.getLanguage(), entry.getValue());
}
}
itemService.update(context, dspaceItem);
context.complete();
}
catch (SQLException e)
{
processException("Could not write metadata to item(id=" + itemId + "), SQLException. Message: " + e, context);
}
catch (ContextException e)
{
processException("Could not write metadata to item(id=" + itemId + "), ContextException. Message: " + e.getMessage(),
context);
} catch (AuthorizeException e) {
processException("Could not update item(id=" + itemId + "), AuthorizeException. Message: " + e.getMessage(),
context);
} finally
{
processFinally(context);
}
log.info("Metadata to item(id=" + itemId + ") were successfully added.");
return Response.status(Status.OK).build();
}