Alfresco 中的自定义表单新用户错误

Posted

技术标签:

【中文标题】Alfresco 中的自定义表单新用户错误【英文标题】:Custom form new user error in Alfresco 【发布时间】:2016-06-22 07:26:10 【问题描述】:

如何制作自定义用户资料?我想为 Alfresco 中的用户添加一个新字段... 我尝试使用这个:http://ecmarchitect.com/archives/2012/02/27/1555,代码:http://ecmarchitect.com/images/articles/alfresco-people/someco-people.zip...

重要代码:

SignUserFactory.java

package com.someco.share;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Map;

import org.alfresco.web.site.SlingshotUserFactory;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.extensions.surf.FrameworkUtil;
import org.springframework.extensions.surf.RequestContext;
import org.springframework.extensions.surf.exception.ConnectorServiceException;
import org.springframework.extensions.surf.exception.UserFactoryException;
import org.springframework.extensions.surf.site.AlfrescoUser;
import org.springframework.extensions.surf.support.ThreadLocalRequestContext;
import org.springframework.extensions.surf.util.StringBuilderWriter;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.connector.Connector;
import org.springframework.extensions.webscripts.connector.ConnectorContext;
import org.springframework.extensions.webscripts.connector.HttpMethod;
import org.springframework.extensions.webscripts.connector.Response;
import org.springframework.extensions.webscripts.json.JSONWriter;

public class SomeCoUserFactory extends SlingshotUserFactory 

    public static final String SCP_BIRTH_DATE = "http://www.someco.com/model/people/1.0birthDate";
    public static String SCP_SHIRT_SIZE = "http://www.someco.com/model/people/1.0shirtSize"; 
    public static String SCP_SIGNIFICANT_OTHER = "http://www.someco.com/model/people/1.0significantOther";
    public static String SCP_LIKES_NEIL_DIAMOND = "http://www.someco.com/model/people/1.0likesNeilDiamond";
    public static String PROP_SCP_BIRTH_DATE = "birthDate";
    public static String PROP_SCP_SHIRT_SIZE = "shirtSize";
    public static String PROP_SCP_SIGNIFICANT_OTHER = "significantOther";
    public static String PROP_SCP_LIKES_NEIL_DIAMOND = "likesNeilDiamond";


    @Override
    protected AlfrescoUser constructUser(JSONObject properties, Map<String, Boolean> capabilities,
            Map<String, Boolean> immutability) throws JSONException 
        AlfrescoUser user = super.constructUser(properties, capabilities, immutability);
        user.setProperty(PROP_SCP_BIRTH_DATE, properties.has(SCP_BIRTH_DATE) ? properties.getString(SCP_BIRTH_DATE) : null);
        user.setProperty(PROP_SCP_SHIRT_SIZE, properties.has(SCP_SHIRT_SIZE) ? properties.getString(SCP_SHIRT_SIZE) : null);
        user.setProperty(PROP_SCP_SIGNIFICANT_OTHER, properties.has(SCP_SIGNIFICANT_OTHER) ? properties.getString(SCP_SIGNIFICANT_OTHER) : null);
        user.setProperty(PROP_SCP_LIKES_NEIL_DIAMOND, properties.has(SCP_LIKES_NEIL_DIAMOND) ? properties.getString(SCP_LIKES_NEIL_DIAMOND) : null);
        return user;
    

    @Override
    public void saveUser(AlfrescoUser user) throws UserFactoryException 
        RequestContext context = (RequestContext)ThreadLocalRequestContext.getRequestContext();
        if (!context.getUserId().equals(user.getId())) 
            throw new UserFactoryException("Unable to persist user with different Id that current Id.");
        

        StringBuilderWriter buf = new StringBuilderWriter(512);
        JSONWriter writer = new JSONWriter(buf);

        try 
            writer.startObject();

            writer.writeValue("username", user.getId());

            writer.startValue("properties");
            writer.startObject();
            writer.writeValue(CM_FIRSTNAME, user.getFirstName());
            writer.writeValue(CM_LASTNAME, user.getLastName());
            writer.writeValue(CM_JOBTITLE, user.getJobTitle());
            writer.writeValue(CM_ORGANIZATION, user.getOrganization());
            writer.writeValue(CM_LOCATION, user.getLocation());
            writer.writeValue(CM_EMAIL, user.getEmail());
            writer.writeValue(CM_TELEPHONE, user.getTelephone());
            writer.writeValue(CM_MOBILE, user.getMobilePhone());
            writer.writeValue(CM_SKYPE, user.getSkype());
            writer.writeValue(CM_INSTANTMSG, user.getInstantMsg());
            writer.writeValue(CM_GOOGLEUSERNAME, user.getGoogleUsername());
            writer.writeValue(CM_COMPANYADDRESS1, user.getCompanyAddress1());
            writer.writeValue(CM_COMPANYADDRESS2, user.getCompanyAddress2());
            writer.writeValue(CM_COMPANYADDRESS3, user.getCompanyAddress3());
            writer.writeValue(CM_COMPANYPOSTCODE, user.getCompanyPostcode());
            writer.writeValue(CM_COMPANYFAX, user.getCompanyFax());
            writer.writeValue(CM_COMPANYEMAIL, user.getCompanyEmail());
            writer.writeValue(CM_COMPANYTELEPHONE, user.getCompanyTelephone());

            // START SomeCo Specific properties
            writer.writeValue(SCP_BIRTH_DATE, user.getStringProperty(PROP_SCP_BIRTH_DATE));
            writer.writeValue(SCP_SHIRT_SIZE, user.getStringProperty(PROP_SCP_SHIRT_SIZE));
            writer.writeValue(SCP_SIGNIFICANT_OTHER, user.getStringProperty(PROP_SCP_SIGNIFICANT_OTHER));
            writer.writeValue(SCP_LIKES_NEIL_DIAMOND, user.getStringProperty(PROP_SCP_LIKES_NEIL_DIAMOND));
            // END SomeCo Specific properties

            writer.endObject();
        writer.endValue();

        writer.startValue("content");
        writer.startObject();
        writer.writeValue(CM_PERSONDESCRIPTION, user.getBiography());
        writer.endObject();
        writer.endValue();

        writer.endObject();

        Connector conn = FrameworkUtil.getConnector(context, ALFRESCO_ENDPOINT_ID);
        ConnectorContext c = new ConnectorContext(HttpMethod.POST);
        c.setContentType("application/json");
        Response res = conn.call("/slingshot/profile/userprofile", c,
                new ByteArrayInputStream(buf.toString().getBytes()));
        if (Status.STATUS_OK != res.getStatus().getCode()) 
            throw new UserFactoryException("Remote error during User save: " + res.getStatus().getMessage());
        
     catch (IOException ioErr) 
        throw new UserFactoryException("IO error during User save: " + ioErr.getMessage(), ioErr);
     catch (ConnectorServiceException cse) 
        throw new UserFactoryException("Configuration error during User save: " + cse.getMessage(), cse);
    
    

share-config-custom.xml

<config evaluator="string-compare" condition="WebFramework" replace="true">
    <web-framework>
        <defaults>
            <user-factory>webframework.factory.user.someco</user-factory>
        </defaults>
    </web-framework>
</config>

custom-slingshot-application-context.xml

      <bean id="webscripts.resources" class="org.springframework.extensions.surf.util.ResourceBundleBootstrapComponent">
      <property name="resourceBundles">
         <list>
            <value>webscripts.messages.webscripts</value>
            <value>alfresco.messages.common</value>
            <value>alfresco.messages.slingshot</value>
            <value>alfresco.web-extension.messages.somecoPeople</value>
         </list>
      </property>
   </bean>

   <bean id="webframework.factory.user.someco" class="com.someco.share.SomeCoUserFactory" parent="webframework.factory.base" />

当我尝试在 Alfresco 中登录时,它给了我这个错误:

严重:Servlet.service() 用于 servlet [Spring Surf Dispatcher Servlet] 在路径 [/share] 的上下文中引发异常 [请求处理 失败的;嵌套异常是 java.lang.NullPointerException] 与根 导致 java.lang.NullPointerException 在 org.springframework.extensions.surf.ObjectPersistenceService.getObject(ObjectPersistenceService.java:128) 在 org.springframework.extensions.surf.ModelObjectService.getObject(ModelObjectService.java:552) 在 org.springframework.extensions.surf.ModelObjectService.getConfiguration(ModelObjectService.java:157) 在 org.springframework.extensions.surf.site.SiteUtil.getSiteConfiguration(SiteUtil.java:104) 在 org.springframework.extensions.surf.site.SiteUtil.getRootPage(SiteUtil.java:53) 在 org.springframework.extensions.surf.support.AbstractRequestContext.getRootPage(AbstractRequestContext.java:320) 在 org.springframework.extensions.surf.mvc.PageViewResolver.canHandle(PageViewResolver.java:109) 在 org.springframework.web.servlet.view.UrlBasedViewResolver.createView(UrlBasedViewResolver.java:386) 在 org.springframework.extensions.webscripts.servlet.mvc.AbstractWebScriptViewResolver.resolveViewName(AbstractWebScriptViewResolver.java:64) 在 org.springframework.web.servlet.DispatcherServlet.resolveViewName(DispatcherServlet.java:1240) 在 org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1181) 在 org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:986) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:933) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.tukey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) 在 org.tukey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 在 org.tukey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 在 org.tukey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.alfresco.web.site.servlet.SecurityHeadersFilter.doFilter(SecurityHeadersFilter.java:168) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.alfresco.web.site.servlet.CSRFFilter.doFilter(CSRFFilter.java:322) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.alfresco.web.site.servlet.SSOAuthenticationFilter.doFilter(SSOAuthenticationFilter.java:447) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.alfresco.web.site.servlet.MTAuthenticationFilter.doFilter(MTAuthenticationFilter.java:74) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466) 在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745)

2016-03-09 18:47:06,039 错误 [alfresco.web.site] [http-apr-8080-exec-2] org.springframework.web.util.NestedServletException:请求 处理失败;嵌套异常是 java.lang.NullPointerException java.lang.NullPointerException 在 org.springframework.extensions.surf.ObjectPersistenceService.getObject(ObjectPersistenceService.java:128) 在 org.springframework.extensions.surf.ModelObjectService.getObject(ModelObjectService.java:552) 在 org.springframework.extensions.surf.ModelObjectService.getConfiguration(ModelObjectService.java:157) 在 org.springframework.extensions.surf.site.SiteUtil.getSiteConfiguration(SiteUtil.java:104) 在 org.springframework.extensions.surf.site.SiteUtil.getRootPage(SiteUtil.java:53) 在 org.springframework.extensions.surf.support.AbstractRequestContext.getRootPage(AbstractRequestContext.java:320) 在 org.springframework.extensions.surf.mvc.PageViewResolver.canHandle(PageViewResolver.java:109) 在 org.springframework.web.servlet.view.UrlBasedViewResolver.createView(UrlBasedViewResolver.java:386) 在 org.springframework.extensions.webscripts.servlet.mvc.AbstractWebScriptViewResolver.resolveViewName(AbstractWebScriptViewResolver.java:64) 在 org.springframework.web.servlet.DispatcherServlet.resolveViewName(DispatcherServlet.java:1240) 在 org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1181) 在 org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:986) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:933) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.tukey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) 在 org.tukey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 在 org.tukey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 在 org.tukey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.alfresco.web.site.servlet.SecurityHeadersFilter.doFilter(SecurityHeadersFilter.java:168) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.alfresco.web.site.servlet.CSRFFilter.doFilter(CSRFFilter.java:322) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.alfresco.web.site.servlet.SSOAuthenticationFilter.doFilter(SSOAuthenticationFilter.java:447) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.alfresco.web.site.servlet.MTAuthenticationFilter.doFilter(MTAuthenticationFilter.java:74) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466) 在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745)

谁能帮我解决这个问题?也许当我将它添加到我的多合一扩展程序时,文件夹不正确。我需要这方面的帮助!

我正在使用 Alfresco Community 5

【问题讨论】:

重复***.com/questions/218384/… 它是重复的,每个NPE都是由完全相同的东西引起的,参考是null 【参考方案1】:

您用作参考的 Jeff Potts 的教程适用于 Alfresco 3.4.d,它不能直接在 Alfresco 5 上运行。

引发的错误似乎是由于您错过了部署内容模型的原因,即教程中引用的 scPeopleModel.xml。

我已使用 Alfresco SDK 2.2 将上述教程转换为 Alfresco 5.1,此项目位于 here

您可以下载zip格式的代码here

这个项目的主要变化是省略了文件 userprofile.get.head.ftl,因为 .head.ftl WebScript 文件现在已从呈现共享组件的 WebScript 中弃用。现在通过使用主 .html.ftl 文件中的 @script 和 @link 标记来加载依赖项。

因此,由于上述原因,您可能会在 userprofile.get.html.ftl 中找到以下代码部分

<@markup id="css" >
   <#-- CSS Dependencies -->
   <@link href="$url.context/res/components/profile/profile.css" group="profile"/>
</@>

<@markup id="js">
   <#-- javascript Dependencies -->
   <@script src="$url.context/res/components/profile/profile.js" group="profile"/>
   <@script src="$url.context/res/modules/simple-dialog.js" group="profile"/>
   <@script src="$url.context/res/components/profile/sc-profile.js" group="profile"/>
</@>

【讨论】:

【参考方案2】:

这是一个简单的 NullPointerException,根据非常明确的错误消息,为您提供类和确切的行:

根本原因 java.lang.NullPointerException at org.springframework.extensions.surf.ObjectPersistenceService.getObject(ObjectPersistenceService.java:128)

您发布的大量代码/配置转储中的任何内容都无法帮助这里的任何人诊断问题所在,尤其是因为似乎没有一行代码是您的。

查看ObjectPersistenceService.java:128的来源后,只需通过调用逐步调试,需要弄清楚如何使它抱怨的任何东西都不是null

每个 NPE 都以完全相同的方式解决,使引用不为空。

【讨论】:

但是在我上面的代码中,我无法理解为什么会出现这个错误。 因为有一些不应该出现在ObjectPersistenceService.java:128行的空值 感谢回复,不过这是在Alfresco环境下,问题不一样,不能像你在这个问题中说的那样“调试”。 您可以逐步调试任何您有源代码的内容。源代码可用于 Spring。 但这可能是 Alfresco 的问题,而不是 java 特有的问题......我需要 Alfresco 的帮助

以上是关于Alfresco 中的自定义表单新用户错误的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 1.4:表单中 CSRF 的自定义错误消息

模板中的自定义表单验证错误

WordPress中的自定义表单并将值存储到自定义数据库中

我可以在 asp.net MVC-5 项目中的我的 aspnet 数据库中添加新的自定义表吗

django 表单向导中的自定义模板 - NameError

模板和隐藏输入中的自定义 Django 表单