[英]How to add a document to the Alfresco Repository with Java code?
EDIT: Apparently I had to make an AMP and map it to Alfresco.war. 编辑:显然我必须制作一个AMP并将其映射到Alfresco.war。 But now I can't access the code I wrote, so I guess I'll have to use Webscripts and the like.
但是现在我无法访问我编写的代码,所以我猜我将不得不使用Webscript等。 Can someone provide an example of how to add a document to the Alfresco Repository with a Java backed webscript?
有人可以提供一个示例,说明如何使用Java支持的Web脚本将文档添加到Alfresco存储库中吗?
ORIGINAL QUESTION: 原始问题:
I've searched google-wide for a way to add a document to the Alfresco Repository with Java code. 我在Google范围内搜索了一种使用Java代码将文档添加到Alfresco存储库的方法。 But I was not able to find a way that would work.
但是我找不到一种可行的方法。 I know how I can add a document to the Repository: use the NodeService.
我知道如何将文档添加到存储库:使用NodeService。 But the problem is that I cannot get an instance of the NodeService.
但是问题是我无法获得NodeService的实例。 I've tried to inject it with @Autowired, I've tried using a bean and I've tried using an ApplicationContext.
我尝试使用@Autowired注入它,尝试使用Bean并尝试使用ApplicationContext。 None of the ways worked...
没有一种工作方式...
Way #1: 方式1:
Injection in a class: 注射类:
@Autowired
NodeService nodeService
Way #2: 方式2:
In service-context.xml: 在service-context.xml中:
<bean id="somerandombeanname" class="management.FileManager" >
<property name="moduleId" value="${project.artifactId}" />
<property name="serviceRegistry" ref="ServiceRegistry" />
<property name="nodeService" ref="NodeService" />
<property name="transactionService" ref="TransactionService" />
<property name="contentService" ref="ContentService" />
</bean>
In the class I added a getter and setter for all the services and the serviceRegistry: 在该类中,我为所有服务和serviceRegistry添加了一个getter和setter:
private NodeService nodeService;
public void setNodeService(NodeService nodeService) {
this.nodeService = nodeService;
}
Way #3: 方式3:
appContext = new ClassPathXmlApplicationContext("classpath:alfresco/application-context.xml");
serviceRegistry = (ServiceRegistry) appContext.getBean(ServiceRegistry.SERVICE_REGISTRY);
nodeService = serviceRegistry.getNodeService();
Ways #1 and #2 gave me a NullPointerException simply stating the NodeService is null. 方法#1和#2给了我一个NullPointerException,简单地指出NodeService为null。 Way #3 gave a mile long StackTrace because of an AlfrescoRuntimeException because it failed to initialize a keystore:
由于AlfrescoRuntimeException异常,方法3提供了1英里长的StackTrace,因为它未能初始化密钥库:
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.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at management.FileManager.<init>(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.<init>(AlfrescoKeyStoreImpl.java:998)
at org.alfresco.encryption.AlfrescoKeyStoreImpl.getKeyInfoManager(AlfrescoKeyStoreImpl.java:395)
at org.alfresco.encryption.AlfrescoKeyStoreImpl.loadKeyStore(AlfrescoKeyStoreImpl.java:560)
... 27 more
Yes, the keystore exists and yes I have regenerated a new keystore. 是的,密钥库存在,是的,我已经重新生成了一个新的密钥库。
I'm using Alfresco 5.0.1 and I'm working on the Repository side (not Share). 我正在使用Alfresco 5.0.1,并且正在存储库端(而不是共享)工作。
@Autowired
NodeService nodeService
Will not work in alfresco 将无法在露天工作
You need to inject it with proper setter method. 您需要使用适当的setter方法注入它。 Your bean should be like below.
您的bean应该如下所示。
<bean id="somerandombeanname" class="management.FileManager" >
<property name="moduleId" value="${project.artifactId}" />
<property name="serviceRegistry" ref="ServiceRegistry" />
<property name="nodeService" ref="NodeService" />
<property name="transactionService" ref="TransactionService" />
<property name="contentService" ref="ContentService" />
</bean>
Your java class should contain following for injecting nodeService. 您的Java类应包含以下用于注入nodeService的对象。
private NodeService nodeService;
public void setNodeService(NodeService nodeService) {
this.nodeService = nodeService;
}
Luckily I have code for file upload thorugh JAVA backed webscript. 幸运的是,我有通过JAVA支持的网页脚本上传文件的代码。 Hope this help you too.To create java backed webscript see this
希望对您有帮助。要创建Java支持的Web脚本,请参阅此
Create one class named CustomFileUpload.java
and put following content 创建一个名为
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<String, Object> executeImpl(WebScriptRequest arg0, Status status, Cache cache) {
Map<String, Object> model = new HashMap<String, Object>();
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();
}
}
NOTE: In destination you can put nodeRef
of folder in which you want to upload. 注意:在目标位置,您可以将要上传的文件夹的
nodeRef
放入。
Than create bean in context file name it whatever you want say mycustom-context.xml
and put it in ALFRESCO_HOME\\tomcat\\shared\\classes\\alfresco\\extension
and content 比在上下文文件中创建bean的名称要多,无论您要说什么
mycustom-context.xml
并将其放在ALFRESCO_HOME\\tomcat\\shared\\classes\\alfresco\\extension
和内容中
<bean id="webscript.com.upload.customupload.post" class="com.upload.CustomFileUpload" parent="webscript">
</bean>
Finally register this web script in alfresco by creating customupload.post.desc.xml
. 最后,通过创建
customupload.post.desc.xml
在露天环境中注册此Web脚本。 and put 并把
<webscript>
<shortname>File Upload</shortname>
<description>Upload files to user home</description>
<url>/upload/fileupload?alf_ticket={ticket}</url>
<format default="json"/>
<authentication>user</authentication>
</webscript>
And last create view as we have declared JSON is default format so we need to create customupload.post.json.ftl
最后一个创建视图(因为我们已声明JSON为默认格式),因此我们需要创建
customupload.post.json.ftl
${result}
And put these both files in ALFRESCO_HOME\\tomcat\\shared\\classes\\alfresco\\extension\\templates\\webscripts\\com\\upload
并将这两个文件放在
ALFRESCO_HOME\\tomcat\\shared\\classes\\alfresco\\extension\\templates\\webscripts\\com\\upload
Now restart server and hit http://localhost:8080/alfresco/service/upload/fileupload and you will see file uploaded in folder(Whatever you have given). 现在重新启动服务器,并点击http:// localhost:8080 / alfresco / service / upload / fileupload ,您将看到文件上传到文件夹中(无论您输入的是什么)。 For Reference
供参考
Finally! 最后! This is the solution for adding a file to the Repository:
这是将文件添加到存储库的解决方案:
CustomFileUpload.java: 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<String, Object> 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<QName, Serializable> props = new HashMap<QName, Serializable>(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<String, Object> model = new HashMap<String, Object>();
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;
}
}
This java class is placed in the following folder: 该java类位于以下文件夹中:
{tomcat}\\webapps\\alfresco\\WEB-INF\\classes\\org\\example
{tomcat} \\ webapps \\ alfresco \\ WEB-INF \\ classes \\ org \\ example
Where org\\example is the same as the package org.example. 其中org \\ example与软件包org.example相同。 Now we have a class, now we need the configuration files as I call them:
现在我们有了一个类,现在我们需要我称之为的配置文件:
- customfileupload-context.xml
customfileupload-context.xml
Which is located here 哪个在这里
- {tomcat}\\shared\\classes\\alfresco\\extension
{tomcat} \\ shared \\ classes \\ alfresco \\ extension
You will also need these: 您还将需要这些:
- customfileupload.post.desc.xml
customfileupload.post.desc.xml
- customfileupload.post.json.ftl
customfileupload.post.json.ftl
Which are located here 哪个位于这里
- {tomcat}\\shared\\classes\\alfresco\\extension\\webscripts\\org\\example
{tomcat} \\ shared \\ classes \\ alfresco \\ extension \\ webscripts \\ org \\ example
Noticed the folder? 注意到文件夹了吗? It's the same like the package mentioned earlier.
就像前面提到的包一样。
Contents of customfileupload-context.xml: customfileupload-context.xml的内容:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN 2.0//EN'
'http://www.springframework.org/dtd/spring-beans-2.0.dtd'>
<beans>
<bean id="webscript.org.example.customfileupload.post" class="org.example.CustomFileUpload" parent="webscript">
<property name="ServiceRegistry" ref="ServiceRegistry" />
</bean>
</beans>
Contents of customfileupload.post.desc.xml: customfileupload.post.desc.xml的内容:
<webscript>
<shortname>File Upload</shortname>
<description>Upload files to user home</description>
<url>/upload/fileupload.json</url>
<format default="json"/>
<authentication runas="admin">guest</authentication>
<transaction>required</transaction>
</webscript>
Contents of customfileupload.post.json.ftl: customfileupload.post.json.ftl的内容:
<#escape x as jsonUtils.encodeJSONString(x)> { "resultRepoWS": "${resultRepoWS}" } </#escape>
This is it. 就是这个。 With this you'll be able to upload a file to the Repository of Alfresco with Alfresco 5.
这样,您就可以使用Alfresco 5将文件上传到Alfresco的信息库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.