如何使用Java代码将文档添加到Alfresco存储库?

编辑:显然我必须制作一个AMP并将其映射到Alfresco.war。 但现在我无法访问我编写的代码,所以我想我将不得不使用Webscripts等。 有人可以提供一个如何使用Java支持的webscript将文档添加到Alfresco存储库的示例吗?

原始问题:

我在谷歌范围内搜索了一种使用Java代码将文档添加到Alfresco存储库的方法。 但我无法找到一种可行的方法。 我知道如何将文档添加到存储库:使用NodeService。 但问题是我无法获得NodeService的实例。 我试图用@Autowired注入它,我尝试使用bean并尝试使用ApplicationContext。 没有一种方法有效……

方式#1:
注入课程:

@Autowired NodeService nodeService 

方式#2:
在service-context.xml中:

        

在课堂上,我为所有服务和serviceRegistry添加了一个getter和setter:

 private NodeService nodeService; public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; } 

方式#3:

 appContext = new ClassPathXmlApplicationContext("classpath:alfresco/application-context.xml"); serviceRegistry = (ServiceRegistry) appContext.getBean(ServiceRegistry.SERVICE_REGISTRY); nodeService = serviceRegistry.getNodeService(); 

方式#1和#2给了我一个NullPointerException,只是声明NodeService为null。 方式#3给出了一英里长的StackTrace因为AlfrescoRuntimeException,因为它无法初始化密钥库:

 Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ssl.keyStore' defined in class path resource [alfresco/encryption-context.xml]: Invocation of init method failed; nested exception is org.alfresco.error.AlfrescoRuntimeException: 04180000 Failed to initialize keystore: Location: E:/Alfresco/alf_data/keystore/ssl.keystore Provider: null Type: JCEKS at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1513) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:633) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:83) at management.FileManager.(FileManager.java:36) at simple.start.main(start.java:25) ... 5 more Caused by: org.alfresco.error.AlfrescoRuntimeException: 04180000 Failed to initialize keystore: Location: E:/Alfresco/alf_data/keystore/ssl.keystore Provider: null Type: JCEKS at org.alfresco.encryption.AlfrescoKeyStoreImpl.loadKeyStore(AlfrescoKeyStoreImpl.java:566) at org.alfresco.encryption.AlfrescoKeyStoreImpl.safeInit(AlfrescoKeyStoreImpl.java:537) at org.alfresco.encryption.AlfrescoKeyStoreImpl.init(AlfrescoKeyStoreImpl.java:122) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1639) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1580) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1510) ... 18 more Caused by: java.lang.IllegalArgumentException: name at sun.misc.URLClassPath$Loader.findResource(URLClassPath.java:494) at sun.misc.URLClassPath.findResource(URLClassPath.java:176) at java.net.URLClassLoader$2.run(URLClassLoader.java:551) at java.net.URLClassLoader$2.run(URLClassLoader.java:549) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findResource(URLClassLoader.java:548) at java.lang.ClassLoader.getResource(ClassLoader.java:1147) at org.springframework.core.io.ClassPathResource.resolveURL(ClassPathResource.java:147) at org.springframework.core.io.ClassPathResource.exists(ClassPathResource.java:135) at org.alfresco.encryption.SpringKeyResourceLoader.getSafeInputStream(SpringKeyResourceLoader.java:67) at org.alfresco.encryption.SpringKeyResourceLoader.loadKeyMetaData(SpringKeyResourceLoader.java:133) at org.alfresco.encryption.AlfrescoKeyStoreImpl$KeyInfoManager.loadKeyMetaData(AlfrescoKeyStoreImpl.java:1016) at org.alfresco.encryption.AlfrescoKeyStoreImpl$KeyInfoManager.(AlfrescoKeyStoreImpl.java:998) at org.alfresco.encryption.AlfrescoKeyStoreImpl.getKeyInfoManager(AlfrescoKeyStoreImpl.java:395) at org.alfresco.encryption.AlfrescoKeyStoreImpl.loadKeyStore(AlfrescoKeyStoreImpl.java:560) ... 27 more 

是的,密钥库存在,是的,我重新生成了一个新的密钥库。

我正在使用Alfresco 5.0.1并且我正在使用Repository端(不是Share)。

 @Autowired NodeService nodeService 

不会在露天工作

你需要用适当的setter方法注入它。 你的bean应该如下所示。

        

注入nodeService时,您的java类应包含以下内容。

 private NodeService nodeService; public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; } 

幸运的是,我有文件上传代码JAVA支持的webscript。 希望这也对你有所帮助。要创建java支持的webscript,请看这个

创建一个名为CustomFileUpload.java类并放入以下内容

 package com.upload; import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.DeclarativeWebScript; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptRequest; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.Map; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.multipart.FilePart; import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity; import org.apache.commons.httpclient.methods.multipart.Part; import org.apache.commons.httpclient.methods.multipart.StringPart; import org.apache.commons.io.IOUtils; import org.json.JSONException; import org.json.JSONObject; public class CustomFileUpload extends DeclarativeWebScript { private final String UPLOAD_FILE_PATH = "C:\\Users\\Test\\Desktop\\test.txt"; private int statusCode; protected Map executeImpl(WebScriptRequest arg0, Status status, Cache cache) { Map model = new HashMap(); try { String URL = "http://localhost:8080/alfresco/service/upload/fileupload?alf_ticket=" +getAlfticket(); File file = new File(UPLOAD_FILE_PATH); String filetype = "text/plain"; String filename = file.getName(); HttpClient client = new HttpClient(); PostMethod post = new PostMethod(URL); Part[] parts = { new FilePart("filedata", filename, file, filetype, null), new StringPart("filename", filename), new StringPart("description", "This is test description"), new StringPart("destination", "workspace://SpacesStore/bb424b1d-0418-4954-8591-b8c807264df0") }; post.setRequestEntity(new MultipartRequestEntity(parts, post.getParams())); statusCode = client.executeMethod(post); System.out.println(post.getResponseBodyAsString()); post.releaseConnection(); } catch (Exception e) { e.printStackTrace(); } if (statusCode == 200) { model.put("result", "File uploaded successfully."); return model; } else { model.put("result", "There was an error while uploading document."); return model; } } private static String getAlfticket() throws IOException, JSONException { URL url = new URL("http://localhost:8080/alfresco/service/api/login?u=admin&pw=admin&format=json"); URLConnection con = url.openConnection(); InputStream in = con.getInputStream(); String encoding = con.getContentEncoding(); encoding = encoding == null ? "UTF-8" : encoding; String json = IOUtils.toString(in, encoding); JSONObject getData = new JSONObject(json); return getData.getJSONObject("data").get("ticket").toString(); } } 

注意:在目标中,您可以将nodeRef放在要上载的文件夹中。

然后在上下文文件名中创建bean,无论你想要什么,请说mycustom-context.xml并将其放入ALFRESCO_HOME\tomcat\shared\classes\alfresco\extension和content

   

最后,通过创建customupload.post.desc.xml在alfresco中注册此Web脚本。 并把

  File Upload Upload files to user home /upload/fileupload?alf_ticket={ticket}  user  

我们声明JSON是默认格式,因此我们需要创建customupload.post.json.ftl

 ${result} 

并将这两个文件放在ALFRESCO_HOME\tomcat\shared\classes\alfresco\extension\templates\webscripts\com\upload

现在重启服务器并点击http:// localhost:8080 / alfresco / service / upload / fileupload ,你会看到文件夹上传的文件(无论你给出了什么)。 供参考

最后! 这是将文件添加到存储库的解决方案:

CustomFileUpload.java:

 package org.example; import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.DeclarativeWebScript; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptRequest; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.apache.commons.io.FileUtils; public class CustomFileUpload extends DeclarativeWebScript { private final String UPLOAD_FILE_PATH = "{someRandomFile}"; private final String UPLOAD_DESTINATION = "workspace://SpacesStore/{someRandomNodeRef}"; protected ServiceRegistry serviceRegistry; public ServiceRegistry getServiceRegistry() { return serviceRegistry; } public void setServiceRegistry(ServiceRegistry serviceRegistry) { this.serviceRegistry = serviceRegistry; } protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) { File file = new File(UPLOAD_FILE_PATH); // NodeRef parent = getCompanyHome(); NodeRef parent = new NodeRef(UPLOAD_DESTINATION); String name = "name of file in Repository " + System.currentTimeMillis(); Map props = new HashMap(1); props.put(ContentModel.PROP_NAME, name); // use the node service to create a new node NodeRef node = serviceRegistry.getNodeService().createNode( parent, ContentModel.ASSOC_CONTAINS, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, name), ContentModel.TYPE_CONTENT, props).getChildRef(); // Use the content service to set the content onto the newly created // node ContentWriter writer = serviceRegistry.getContentService().getWriter(node, ContentModel.PROP_CONTENT, true); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); String text = ""; try { text = FileUtils.readFileToString(file); } catch (IOException e) { e.printStackTrace(); } writer.putContent(text); Map model = new HashMap(); if (status.getCode() == Status.STATUS_OK) { model.put("resultRepoWS", "File \"" + file.getName() + "\" uploaded successfully to the repository. Status: " + status.getCode()); return model; } else { model.put("resultRepoWS", "There was an error while uploading document \"" + file.getName() + "\" - Status: " + status.getCode()); return model; } } //If you want to test with CompanyHome first use this method instead of the NodeRef @SuppressWarnings("unused") private NodeRef getCompanyHome() { StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"); serviceRegistry.getSearchService(); ResultSet rs = serviceRegistry.getSearchService().query(storeRef, SearchService.LANGUAGE_XPATH, "/app:company_home"); NodeRef parent = null; try { if (rs.length() == 0) { throw new AlfrescoRuntimeException("Didn't find Company Home"); } parent = rs.getNodeRef(0); } finally { rs.close(); } return parent; } } 

这个java类放在以下文件夹中:

{的Tomcat} \ web应用\露天\ WEB-INF \类\有机\示例

其中org \ example与包org.example相同。 现在我们有一个类,现在我们需要配置文件,因为我调用它们:

  • customfileupload-的context.xml

哪个位于这里

  • {的Tomcat} \共享\类\露天\扩展

你还需要这些:

  • customfileupload.post.desc.xml
  • customfileupload.post.json.ftl

哪个位于这里

  • {的Tomcat} \共享\类\露天\扩展\ webscripts \有机\示例

注意到文件夹? 它和前面提到的包一样。

customfileupload-context.xml的内容:

        

customfileupload.post.desc.xml的内容:

  File Upload Upload files to user home /upload/fileupload.json  guest required  

customfileupload.post.json.ftl的内容:

 <#escape x as jsonUtils.encodeJSONString(x)> { "resultRepoWS": "${resultRepoWS}" }  

就是这个。 有了这个,您就可以使用Alfresco 5将文件上传到Alfresco的存储库。