使用Content Navigator Plugin发送电子邮件

问题描述 投票:0回答:3

我有一个内容导航器插件,我需要发送一封电子邮件。插件部署在Websphere中,下面是我遵循的步骤。

  1. 在WAS中创建了一个邮件提供程序
  2. 创建邮件会话并选择“smtp”作为协议

我有一个发送电子邮件的java代码

Context context = new InitialContext(); 
Session mailSession = (Session)context.lookup("mail/mySession"); 
Message msg = new MimeMessage(mailSession); 
msg.setFrom(new InternetAddress(email)); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(destinationAddress)); 
// Set the subject and body text 
msg.setSubject(subject); 
msg.setText(messageBody); 
// send message 
Transport.send(msg);

我收到错误了

java.lang.ClassCastException: javax.mail.Session incompatible with javax.mail.Session

我的webpshere(C:\ IBM \ WebSphere \ AppServer \ lib)默认有mailapi.jar。甚至navigator.war和taskManagerWeb.war也有相同的jar。我认为问题是由于在同一个websphere中有多个jar。任何人都可以帮我解决这个问题吗?

websphere javamail websphere-8 ibm-content-navigator
3个回答
0
投票

由于WebSphere是Java EE产品,因此它应该包含完整的JavaMail实现。您不需要在应用程序中包含任何JavaMail jar文件。


0
投票

已经有一段时间了,但很久以前我遇到了同样的问题。我终于得出结论,Navigator包含它自己的javax.mail - 并且由于你的插件由ad-hoc导航器创建的父级最后一个类加载器加载,它将无法将EE javax.mail.session与插件类加载器找到的javax.mail.session。

我建议使用以下两种解决方案之一:

  1. 将您的邮件功能移到导航器插件之外。例如。创建一个执行您的功能的EJB,并从您的插件中注入/查找EJB。
  2. 使用Navigator邮件会话而不是Websphere邮件会话。

另外两种选择:

  1. 不要进行类型转换并使用反射。我不确定你是否能够使用错误的类找到正确的MimeMessage构造函数。
  2. 使用代码模块从CPE发送电子邮件。虽然您描述的问题实际上也适用于CPE,但它可以让您选择使用PE配置或CE配置的邮件会话。

-1
投票

以下代码可能对您有所帮助。请注意,我评论了代码以帮助您使用该解决方案。

 **- **RecoveryBin.js****
require([ "dojo/_base/declare", "dojo/_base/lang", "ecm/model/Request",
        "ecm/model/ResultSet", "recoveryBeanDojo/BestDialog",
        "ecm/widget/ComboBox", "dojo/domReady!" ], function(declare, lang,
        Request, ResultSet, BestDialog, ComboBox) {
    /**
     * Use this function to add any global JavaScript methods your plug-in requires.
     */
    lang.setObject("moveToRB", function(repository, items, callback, teamspace,
            resultSet, parameterMap) {
        /*
         * Add custom code for your action here. For example, your action might launch a dialog or call a plug-in service.
         */
        // Iterating items array --- {d0c1},{doc2}
        var itemsList="";
        console.log("Number of selected documents -- "+ items.length);
        for(var j=0;j<items.length;j++)
        {
            itemsList=itemsList+items[j].id+",";
            console.log("Item is --"+itemsList);
        }
        console.log("New Items String is ---- "+itemsList);
        var bestDialog = null;
        var serviceParams = {
            icnRepository : repository.id,
            serverType : repository.type,
        //  s : items[0].id,
            s : itemsList,
        };

        Request.invokePluginService("RecoveryBean", "MoveToRBService", {

            requestParams : serviceParams,

            requestCompleteCallback : lang.hitch(this, function(response) {
                var rb;
                for (var i = 0; i < response.rb.length; i++) {
                    rb = response.rb[i];
                }// success*/
                console.log("Before New Dialog ");
                bestDialog = new BestDialog();
                //bestDialog.setContentItem(items[0]);
                bestDialog._show(rb, repository, items);
                bestDialog.show();
                console.log("After bin Dialog");

            })

        });
    });
});

**

 - BestDialog.js

**

define([ "dojo/_base/declare", "ecm/widget/dialog/BaseDialog",
        "dijit/form/CurrencyTextBox", "dojo/currency", "ecm/model/ContentItem",
        "dojo/store/Memory", "ecm/model/Request", "ecm/model/ResultSet",
        "dijit/layout/ContentPane", "dojo/dom-attr",
        "ecm/widget/layout/_RepositorySelectorMixin",
        "ecm/widget/listView/ContentList", "ecm/model/Desktop",
        "dojo/_base/lang", "ecm/widget/ComboBox",
        "dojo/text!./templates/BestDialog.html" ], function(declare,
        BaseDialog, CurrencyTextBox, currency, ContentItem, MemoryStore,
        Request, ResultSet, ContentPane, domAttr, _RepositorySelectorMixin,
        ContentList, Desktop, lang, ComboBox, template) {

    /**
     * @name sampleICNPluginDojo.BestDialog
     * @class Provides a dialog that demonstrates the right thing to do. 
     * @augments ecm.widget.BaseDialog
     */
    return declare("newPluginDojo.BestDialog", [ BaseDialog ], {
        /** @lends sampleICNPluginDojo.BestDialog.prototype */

        contentString : template,
        widgetsInTemplate : true,
        contentItem : null,
        _repository : null,
        _items : null,
        itemsList:null,
        _binlist : null,        
        postCreate : function() {
            console.log("Inside BestDialog.js:: postCreate ");
            this.inherited(arguments);
            this.setTitle("Recovery - Beans");

            this.okButton = this.addButton("Ok", "_okClick", false, true);
        },
        _okClick : function() {
            console.log("Inside BestDialog.js:: _okClick ");
            var n = this._binlist.value;

            var serviceParams = {

                icnRepository : this._repository.id,
                serverType : this._repository.type,
                s : this.itemsList,
                rbName : n
            };
            Request.invokePluginService("RecoveryBean", "RecoveryService", {

                requestParams : serviceParams,
                requestCompleteCallback : lang.hitch(this, function(response) {

                    var bestDialog = new BaseDialog();
                    bestDialog.set("title", "Deleted Items Bean");
                    bestDialog.set("content","Document Are Successfully Moved To Recycle Bin");
                    bestDialog.show();
                    console.log("After Recovery Service Dialog");

                })

            });
            this.hide();
            this.destroyRecursive(); // Destroys all child widgets as well
        },

        onCancel : function() {
            this.destroyRecursive();
        },
        // Method responsible to show dialog box:- Documented by Ashok
        _show : function(rb, repository, items) {
            console.log("inside show ");
            this._repository = repository;
            this._items = items;
            this._rb = rb;
            var item = [];

            for ( var key in rb) {
                item.push({
                    "id" : rb[key],
                    "name" : key
                });
                console.log(key + ":" + rb[key]);
            }

            // Create test store.
            comboStore = new MemoryStore({
                data : item
            });
            this._binlist = this.binlist;
            this._binlist.store = comboStore;

            console.log("Completed");

        }

    });
});

**MoveToRBService.java**

package com.ibm.demo;

import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;

import javax.security.auth.Subject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.filenet.api.collection.CmRecoveryItemSet;
import com.filenet.api.collection.EventSet;
import com.filenet.api.collection.IndependentObjectSet;
import com.filenet.api.constants.RefreshMode;
import com.filenet.api.core.Document;
import com.filenet.api.core.Factory;
import com.filenet.api.core.ObjectStore;
import com.filenet.api.core.VersionSeries;
import com.filenet.api.events.Event;
import com.filenet.api.query.SearchSQL;
import com.filenet.api.query.SearchScope;
import com.filenet.api.util.CmRecoveryBin;
import com.filenet.api.util.CmRecoveryItem;
import com.filenet.api.util.Id;
import com.filenet.api.util.UserContext;
import com.ibm.ecm.extension.PluginResponseUtil;
import com.ibm.ecm.extension.PluginService;
import com.ibm.ecm.extension.PluginServiceCallbacks;
import com.ibm.ecm.json.JSONMessage;
import com.ibm.ecm.json.JSONResponse;
import com.ibm.ecm.json.JSONResultSetResponse;
import com.ibm.json.java.JSONArray;
import com.ibm.json.java.JSONObject;

/**
 * Provides an abstract class that is extended to create a class implementing
 * each service provided by the plug-in. Services are actions, similar to
 * servlets or Struts actions, that perform operations on the IBM Content
 * Navigator server. A service can access content server application programming
 * interfaces (APIs) and Java EE APIs.
 * <p>
 * Services are invoked from the JavaScript functions that are defined for the
 * plug-in by using the <code>ecm.model.Request.invokePluginService</code>
 * function.
 * </p>
 * Follow best practices for servlets when implementing an IBM Content Navigator
 * plug-in service. In particular, always assume multi-threaded use and do not
 * keep unshared information in instance variables.
 */
public class MoveToRBService extends PluginService {
    public static final String REPOSITORY_ID = "icnRepository";
    public static final String REPOSITORY_TYPE = "serverType";

    /**
     * Returns the unique identifier for this service.
     * <p>
     * <strong>Important:</strong> This identifier is used in URLs so it must
     * contain only alphanumeric characters.
     * </p>
     * 
     * @return A <code>String</code> that is used to identify the service.
     */
    public String getId() {
        return "MoveToRBService";
    }

    /**
     * Returns the name of the IBM Content Navigator service that this service
     * overrides. If this service does not override an IBM Content Navigator
     * service, this method returns <code>null</code>.
     * 
     * @returns The name of the service.
     */
    public String getOverriddenService() {
        return null;
    }

    /**
     * Performs the action of this service.
     * 
     * @param callbacks
     *            An instance of the <code>PluginServiceCallbacks</code> class
     *            that contains several functions that can be used by the
     *            service. These functions provide access to the plug-in
     *            configuration and content server APIs.
     * @param request
     *            The <code>HttpServletRequest</code> object that provides the
     *            request. The service can access the invocation parameters from
     *            the request.
     * @param response
     *            The <code>HttpServletResponse</code> object that is generated
     *            by the service. The service can get the output stream and
     *            write the response. The response must be in JSON format.
     * @throws Exception
     *             For exceptions that occur when the service is running. If the
     *             logging level is high enough to log errors, information about
     *             the exception is logged by IBM Content Navigator.
     */
    public void execute(PluginServiceCallbacks callbacks, HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        String repositoryId = request.getParameter(REPOSITORY_ID);
        String repositoryType = request.getParameter(REPOSITORY_TYPE);
        JSONResponse jsonResponse = new JSONResponse();
        ObjectStore objectStore = null;
        JSONObject jsonObject = new JSONObject();
        JSONObject finalJsonObj = new JSONObject();
        JSONArray jsonArray = new JSONArray();
        CmRecoveryBin bin = null;
        try {
            if (repositoryType.equals("p8")) {
                Subject subject = callbacks.getP8Subject(repositoryId);
                UserContext.get().pushSubject(subject);
                System.out.println("in first if");
            }
            Object synchObject = callbacks.getSynchObject(repositoryId, repositoryType);
            if (synchObject != null) {
                synchronized (synchObject) {
                    if (repositoryType.equals("p8")) {
                        System.out.println(" synchObject Value :Ashok"+ synchObject.toString());
                        System.out.println("in synchronised block");
                        objectStore = callbacks.getP8ObjectStore(repositoryId);

                        System.out.println("ObjectStore!!!!!!!!!123" + objectStore.get_DisplayName());
                    }
                }
                SearchSQL sqlObject = new SearchSQL("select * from CmRecoveryBin");
                SearchScope searchScope = new SearchScope(objectStore);
                Integer myPageSize = new Integer(1000);
                Boolean continuable = Boolean.valueOf(true);
                IndependentObjectSet binSet = searchScope.fetchObjects(sqlObject, myPageSize, null, continuable);

                // Iterate the set of recovery bins.
                Iterator iterOuter = binSet.iterator();

                while (iterOuter.hasNext()) {
                    bin = (CmRecoveryBin) iterOuter.next();
                    System.out.println("\nRecovery bin: " + bin.get_DisplayName() + "   ID: " + bin.get_Id());
                    jsonObject.put(bin.get_DisplayName(), bin.get_Id().toString());
                    jsonArray.add(jsonObject);
                }

                finalJsonObj.put("rb", jsonArray);
                System.out.println("in cache control!!!!!!!!!!!!!!");
                response.addHeader("Cache-Control", "no-cache");
                response.setContentType("text/plain"); // must be text/plain for
                                                        // firebug
                response.setCharacterEncoding("UTF-8");
                Writer writer = response.getWriter();
                writer.write(finalJsonObj.toString());
                System.out.println("Printing results = " + finalJsonObj.toString());

            }

        } catch (Exception exc) {
            JSONMessage message = new JSONMessage(0,
                    "The document could not be retrieved.  Details have been written to the server error log.", null,
                    null, null, null);
            jsonResponse.addErrorMessage(message);
            exc.printStackTrace();
        }

    }
}


**BestDialog.html**
<div>
<select data-dojo-type="ecm/widget/ComboBox" data-dojo-attach-point="binlist"></select></div>
© www.soinside.com 2019 - 2024. All rights reserved.