2017-09-18 27 views
2

我們正在嘗試構建一個應用程序,以使用REST API提供在DSpace中獲取的項目元數據的批量編輯。更新操作反映在DSpace UI中。但是,除非我們運行索引發現,否則元數據在Solr中保持不變。由於我們打算使用大量的數據,因此每次編輯元數據時都要運行索引發現,這將非常昂貴。有人可以爲此提出解決方法/解決方案嗎?通過REST更新後在DSpace 6.2中重新索引項目

回答

2

您可以在REST端點的Java類中觸發項更新。

例如: 在java類org.dspace.rest.ItemsResource的方法addItemMetadata它代表/項目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(); 
} 
+0

實際上,我們恢復到舊版本的DSpace(5.6),因爲我們真的不希望做任何代碼級別DSpace中的修改。希望這個問題在後續版本中得到解決 –