Liferay服务生成器+;文档库&x2B;石英调度器&x2B;阿帕奇POI

Liferay服务生成器+;文档库&x2B;石英调度器&x2B;阿帕奇POI,liferay,quartz-scheduler,document-library,Liferay,Quartz Scheduler,Document Library,大家好,我的社区 要求: 我需要有关如何创建Liferay(LR)模块的建议和帮助,该模块将使用从数据库中提取的信息创建XLS文件,并在一周的计划时间内将其存储到文档库(DL)中的文件夹位置 解决方案: 我决定使用LR的ServiceBuilder+DL+Quartz调度器+ApachePOI。代码如下 路障: receive()方法需要RenderRequest对象,以便可以创建主题显示和ServiceContext对象,DLAppServiceUtil将使用该对象在DL中创建文件。如何创建R

大家好,我的社区

要求: 我需要有关如何创建Liferay(LR)模块的建议和帮助,该模块将使用从数据库中提取的信息创建XLS文件,并在一周的计划时间内将其存储到文档库(DL)中的文件夹位置

解决方案: 我决定使用LR的ServiceBuilder+DL+Quartz调度器+ApachePOI。代码如下

路障: receive()方法需要RenderRequest对象,以便可以创建主题显示和ServiceContext对象,DLAppServiceUtil将使用该对象在DL中创建文件。如何创建RenderRequest对象

@Override
public void receive(Message message) throws MessageListenerException {
    _log.debug(">> receive()");

    ThemeDisplay themeDisplay = (ThemeDisplay) renderRequest.getAttribute(WebKeys.THEME_DISPLAY);
    fileUploadByApp("folder-1", themeDisplay, renderRequest);

    _log.debug("<< receive()");
}

public void fileUploadByApp(String folderName, ThemeDisplay themeDisplay, RenderRequest renderRequest) {

    try {
        File file = new File("D:/liferay-portal-6.2-ce-ga6/temp/sample_" + getDateTimeBasedFilename() + ".txt");

        Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"));
        writer.write("Something");
        writer.close();

        long repositoryId = themeDisplay.getScopeGroupId();
        String mimeType = MimeTypesUtil.getContentType(file);
        String title = file.getName();
        String description = "This file is added via programatically";
        String changeLog = "hi";
        Long parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;

        Folder folder = DLAppServiceUtil.getFolder(themeDisplay.getScopeGroupId(), parentFolderId, folderName);
        ServiceContext serviceContext = ServiceContextFactory.getInstance(DLFileEntry.class.getName(),
                renderRequest);
        InputStream is = new FileInputStream(file);
        DLAppServiceUtil.addFileEntry(repositoryId, folder.getFolderId(), file.getName(), mimeType, title,
                description, changeLog, is, file.length(), serviceContext);

    } catch (Exception e) {
        System.out.println("Exception");
        e.printStackTrace();
    }
}
@覆盖
public void receive(消息消息)引发MessageListenerException{
_log.debug(“>>receive()”);
主题显示主题显示=(主题显示)renderRequest.getAttribute(WebKeys.THEME\u DISPLAY);
fileUploadByApp(“文件夹-1”,主题显示,渲染请求);

_log.debug("首先,方法
receive
不需要
RenderRequest
对象,但是你的方法
fileUploadByApp
。如果你仔细查看你的方法,你需要的
主题显示
就是
scopeGroupId
RenderRequest
对象,正如你提到的,是创建
服务所必需的eContext
,但您至少有两种解决方案

  • ServletContextPool
    获取一些实例(如果可能的话)
  • 手动创建对象
  • 在第二种情况下,您可以设置您需要的内容,但我认为您只需要设置
    scopeGroupId
    ,并且它可以根据您的需要工作

    更改示例:

    @覆盖
    public void receive(消息消息)引发MessageListenerException{
    _log.debug(“>>receive()”);
    ServiceContext ServiceContext=新的ServiceContext();
    serviceContext.setScopeGroupId(您的_SCOPE_GROUP_ID);//例如,您的_SCOPE_GROUP_ID可以从消息接收。
    fileUploadByApp(“文件夹-1”,serviceContext);
    
    _log.debug("首先,方法
    receive
    不需要
    RenderRequest
    对象,但是你的方法
    fileUploadByApp
    。如果你仔细查看你的方法,你需要的
    主题显示
    就是
    scopeGroupId
    RenderRequest
    对象,正如你提到的,是创建
    服务所必需的eContext
    ,但您至少有两种解决方案

  • ServletContextPool
    获取一些实例(如果可能的话)
  • 手动创建对象
  • 在第二种情况下,您可以设置您需要的内容,但我认为您只需要设置
    scopeGroupId
    ,并且它可以根据您的需要工作

    更改示例:

    @覆盖
    public void receive(消息消息)引发MessageListenerException{
    _log.debug(“>>receive()”);
    ServiceContext ServiceContext=新的ServiceContext();
    serviceContext.setScopeGroupId(您的_SCOPE_GROUP_ID);//例如,您的_SCOPE_GROUP_ID可以从消息接收。
    fileUploadByApp(“文件夹-1”,serviceContext);
    
    _log.debug(“谢谢glw。提供的代码有助于连接dots。除了您提供的代码片段之外,我还使用了下面的解决方案

    // Repository ID of the document library, figured is out by the output from
    // _log.debug("repositoryId: " + repositoryId);
    // in
    // fileUploadByApp(folderName, themeDisplay, renderRequest).
    // I found the entry in 'ddmcontent' table of LR's default DB
    private long siteARepoId = ?????;
    // Found this in 'company' table of LR's default DB
    private long LRCompanyId = ?????;
    private String sAdminRole = "Administrator";
    
    @Override
    public void receive(Message message) throws MessageListenerException {
        _log.debug(">> receive()");
    
        ServiceContext serviceContext = new ServiceContext();
        serviceContext.setScopeGroupId(siteARepoId);
        fileUploadByApp(DLFolderLocation, serviceContext);
    
        _log.debug("<< receive()");
    }
    
    public void fileUploadByApp(String folderName, ServiceContext serviceContext) {
        _log.debug(">> fileUploadByApp(folderName, serviceContext)");
    
        try {
            File file = new File(LRTempLocation + "excel_" + getDateTimeBasedFilename() + ".xlsx");
    
            createExcel(file);
    
            long repositoryId = serviceContext.getScopeGroupId();
            String mimeType = MimeTypesUtil.getContentType(file);
            String title = file.getName();
            String description = "This file is added via programatically";
            String changeLog = "hi";
            Long parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
    
            _log.debug("repositoryId: " + repositoryId);
            _log.debug("fileName: " + file.getName());
            _log.debug("mimeType: " + mimeType);
            _log.debug("title: " + title);
            _log.debug("description: " + description);
            _log.debug("changeLog: " + changeLog);
            _log.debug("fileLength: " + file.length());
            _log.debug("serviceContext: " + serviceContext);
    
            Folder folder = DLAppLocalServiceUtil.getFolder(repositoryId, parentFolderId, folderName);
    
            _log.debug("folderId: " + folder.getFolderId());
    
            InputStream is = new FileInputStream(file);
    
            _log.debug("inputStream: " + is);
    
            // Initializing PermissionChecker, without the below the exception
            // occurs
            // Caused by: com.liferay.portal.security.auth.PrincipalException:
            // PermissionChecker not initialized
            // Source:
            // http://www.open.gr/blog/2014/05/permissionchecker-not-initialised-scheduler-job
            Company companyqq = CompanyLocalServiceUtil.getCompanyById(LRCompanyId);
            Role adminRole = RoleLocalServiceUtil.getRole(companyqq.getCompanyId(), sAdminRole);
            List<User> adminUsers = UserLocalServiceUtil.getRoleUsers(adminRole.getRoleId());
            PrincipalThreadLocal.setName(adminUsers.get(0).getUserId());
            PermissionChecker permissionChecker = PermissionCheckerFactoryUtil.create(adminUsers.get(0), true);
            PermissionThreadLocal.setPermissionChecker(permissionChecker);
    
            // Adding the file entry to the Document Library
            DLAppServiceUtil.addFileEntry(repositoryId, folder.getFolderId(), file.getName(), mimeType, title,
                    description, changeLog, is, file.length(), serviceContext);
    
        } catch (Exception e) {
            System.out.println("Exception");
            e.printStackTrace();
        }
    
        _log.debug("<< fileUploadByApp(folderName, serviceContext)");
    }
    
    //文档库的存储库ID由
    //_log.debug(“repositoryId:+repositoryId”);
    //在
    //fileUploadByApp(folderName、主题显示、renderRequest)。
    //我在LR的默认数据库的“ddmcontent”表中找到了条目
    私有长站点arepoid=?????;
    //在LR默认数据库的“公司”表中找到此项
    私人长线公司ID=?????;
    私有字符串sAdminRole=“管理员”;
    @凌驾
    public void receive(消息消息)引发MessageListenerException{
    _log.debug(“>>receive()”);
    ServiceContext ServiceContext=新的ServiceContext();
    serviceContext.setScopeGroupId(siteARepoId);
    fileUploadByApp(DLFolderLocation、serviceContext);
    _log.debug(“>fileUploadByApp(folderName,serviceContext)”);
    试一试{
    File File=新文件(lrtemplacation+“excel_quot+getDateTimeBasedFilename()+”.xlsx”);
    创建Excel(文件);
    long repositoryId=serviceContext.getScopeGroupId();
    字符串mimeType=MimeTypesUtil.getContentType(文件);
    字符串title=file.getName();
    String description=“此文件通过编程方式添加”;
    字符串changeLog=“hi”;
    长parentFolderId=DLFolderConstants.DEFAULT\u PARENT\u FOLDER\u ID;
    _调试(“repositoryId:+repositoryId”);
    _log.debug(“文件名:“+file.getName());
    _调试(“mimeType:+mimeType”);
    _log.debug(“标题:”+标题);
    _log.debug(“说明:”+说明);
    _调试(“changeLog:+changeLog”);
    _log.debug(“fileLength:+file.length());
    _log.debug(“serviceContext:+serviceContext”);
    Folder Folder=DLAppLocalServiceUtil.getFolder(repositoryId、parentFolderId、folderName);
    _log.debug(“folderId:+folder.getFolderId());
    InputStream is=新文件InputStream(文件);
    _调试(“inputStream:+is”);
    //正在初始化PermissionChecker,没有以下异常
    //发生
    //原因:com.liferay.portal.security.auth.PrincipalException:
    //PermissionChecker未初始化
    //资料来源:
    // http://www.open.gr/blog/2014/05/permissionchecker-not-initialised-scheduler-job
    Company companyqq=companycalserviceutil.getCompanyById(lrcomanyid);
    Role adminRole=RoleLocalServiceUtil.getRole(companyqq.getCompanyId(),sAdminRole);
    List adminUsers=UserLocalServiceUtil.getRoleUsers(adminRole.getRoleId());
    PrincipalThreadLocal.setName(adminUsers.get(0.getUserId());
    PermissionChecker PermissionChecker=PermissionCheckerFactoryUtil.create(adminUsers.get(0),true);