Java与SSRS的集成

Java与SSRS的集成,java,reporting-services,websphere,Java,Reporting Services,Websphere,您好,我正在考虑使用Java(在WebSphere8.5中部署为servlet)与SSR集成。我已经研究了一些示例代码并进行了尝试 private static SoapHeader createExecutionIdSoapHeader(String executionId) { Document doc = DOMUtils.createDocument(); Element executionHeaderElement = doc.createElement("

您好,我正在考虑使用Java(在WebSphere8.5中部署为servlet)与SSR集成。我已经研究了一些示例代码并进行了尝试

private static SoapHeader createExecutionIdSoapHeader(String executionId) {     
    Document doc = DOMUtils.createDocument();

    Element executionHeaderElement = doc.createElement("ExecutionHeader");
    executionHeaderElement.setAttribute("xmlns", XML_NAMESPACE);

    Element executionIdElement = doc.createElement("ExecutionID");
    executionIdElement.setTextContent(executionId);

    executionHeaderElement.appendChild(executionIdElement);

    SoapHeader soapH = new SoapHeader(new QName(XML_NAMESPACE, "ExecutionHeader"), executionHeaderElement);     
    return soapH;
}


public static Holder<byte[]> getReportResult(String output_type, String reportFolder, String reportName, ArrayOfParameterValue arrayOfParameterValue) {
    Holder<byte[]> result = null;

    try {
        String historyID = null;
        String executionID = null;

        ReportExecutionServiceSoap service = getExecutionService();
        BindingProvider bp = (BindingProvider) service;
        bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, authenticator.getUsername());
        bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, authenticator.getPassword());

        ExecutionInfo info = new ExecutionInfo();
        info = service.loadReport(REPORT_PATH, historyID);          
        executionID = info.getExecutionID();

        List<Header> headers = new ArrayList<Header>();
        SoapHeader header = createExecutionIdSoapHeader(executionID);

        headers.add(header);    

        bp.getRequestContext().put(Header.HEADER_LIST, headers);

        if (!arrayOfParameterValue.getParameterValue().isEmpty()) {
            service.setExecutionParameters(arrayOfParameterValue, "en-us");
        }

        // Default to return HTML4.0
        String deviceInfo = "";
        if (output_type == null || output_type.isEmpty()) {
            output_type = "HTML4.0";
        }

        if ("IMAGE".equalsIgnoreCase(output_type)) {
            deviceInfo = RENDER_DEVICE_INFO_IMAGE;
        } else {
            deviceInfo = RENDER_DEVICE_INFO_HTML;
        }

        result = new Holder<byte[]>();
        Holder<String> extension = new Holder<String>();
        Holder<String> mimeType = new Holder<String>();
        Holder<String> encoding = new Holder<String>();
        Holder<ArrayOfWarning> warnings = new Holder<ArrayOfWarning>();
        Holder<ArrayOfString> streamIDs = new Holder<ArrayOfString>();

        service.render(output_type, deviceInfo, result, extension, mimeType, encoding, warnings, streamIDs);
    } catch (Throwable th) {
        th.printStackTrace();
    }

    return result;
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    try {
        ArrayOfParameterValue arrayOfParameterValue = new ArrayOfParameterValue();
        List<ParameterValue> parameters = arrayOfParameterValue.getParameterValue();
        ParameterValue parameterValue = new ParameterValue();
        parameterValue.setName(PARAMETER_NAME);
        parameterValue.setValue(PARAMETER_VALUE);
        parameters.add(parameterValue);

        Holder<byte[]> result = GenerateReport.getReportResult(REPORT_FORMAT, REPORT_FOLDER, REPORT_NAME,
                arrayOfParameterValue);

        System.out.println("--------------------------------- Writing to Browser --------------------------------");
        ServletOutputStream out = response.getOutputStream();
        out.write(result.value);
        out.flush();
        out.close();

        System.out.println("--------------------------------- Writing to File -----------------------------------");
        DateFormat df = new SimpleDateFormat("dd_MM_yy_HH_mm_ss_");
        Date date = new Date();
        String filename = df.format(date) + "SSRS_Report.pdf";
        FileOutputStream o = new FileOutputStream("C:\\Users\\keh\\Desktop\\Temp\\" + filename);
        o.write(result.value);
        o.flush();
        o.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
私有静态SoapHeader createExecutionIdSoapHeader(字符串executionId){
Document doc=DOMUtils.createDocument();
Element executionHeaderElement=doc.createElement(“ExecutionHeader”);
setAttribute(“xmlns”,XML\u名称空间);
Element ExecutionIdeElement=doc.createElement(“ExecutionID”);
setTextContent(executionId);
executionHeaderElement.appendChild(ExecutionIdeElement);
SoapHeader soapH=新的SoapHeader(新的QName(XML_名称空间,“ExecutionHeader”),executionHeaderElement);
返回soapH;
}
公共静态持有者getReportResult(字符串输出类型、字符串reportFolder、字符串reportName、ArrayOfParameterValue ArrayOfParameterValue){
Holder result=null;
试一试{
字符串historyID=null;
字符串executionID=null;
ReportExecutionServiceSoap服务=getExecutionService();
BindingProvider bp=(BindingProvider)服务;
bp.getRequestContext().put(BindingProvider.USERNAME_属性,authenticator.getUsername());
bp.getRequestContext().put(BindingProvider.PASSWORD_属性,authenticator.getPassword());
ExecutionInfo=新的ExecutionInfo();
info=service.loadReport(报告路径,历史ID);
executionID=info.getExecutionID();
列表标题=新建ArrayList();
SoapHeader header=createExecutionIdSoapHeader(executionID);
headers.add(header);
bp.getRequestContext().put(Header.Header_列表,headers);
如果(!arrayOfParameterValue.getParameterValue().isEmpty()){
服务.setExecutionParameters(arrayOfParameterValue,“en-us”);
}
//默认返回HTML4.0
字符串deviceInfo=“”;
if(output_type==null | | output_type.isEmpty()){
输出\u type=“HTML4.0”;
}
if(“IMAGE”.equalsIgnoreCase(输出类型)){
deviceInfo=渲染设备信息图像;
}否则{
deviceInfo=呈现设备信息HTML;
}
结果=新支架();
支架扩展=新支架();
保持架mimeType=新保持架();
支架编码=新支架();
保持架警告=新保持架();
保持架流线型=新保持架();
呈现(输出类型、设备信息、结果、扩展、mimeType、编码、警告、流ID);
}捕获(可丢弃){
th.printStackTrace();
}
返回结果;
}
受保护的void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
试一试{
ArrayOfParameterValue ArrayOfParameterValue=新的ArrayOfParameterValue();
列表参数=arrayOfParameterValue.getParameterValue();
ParameterValue ParameterValue=新的ParameterValue();
parameterValue.setName(参数名称);
参数值。设置值(参数值);
parameters.add(parameterValue);
Holder result=GenerateReport.getReportResult(报告格式、报告文件夹、报告名称、,
arrayOfParameterValue);
System.out.println(“---------------------------------------写入浏览器------------------------------”;
ServletOutputStream out=response.getOutputStream();
输出。写入(结果。值);
out.flush();
out.close();
System.out.println(“---------------------------------------写入文件---------------------------------------------”;
DateFormat df=新的简化格式(“dd_-MM_-yy_-HH_-MM_-ss”);
日期=新日期();
字符串文件名=df.format(date)+“SSRS_Report.pdf”;
FileOutputStream o=新的FileOutputStream(“C:\\Users\\keh\\Desktop\\Temp\\\”+文件名);
o、 写入(结果值);
o、 冲洗();
o、 close();
}捕获(例外e){
e、 printStackTrace();
}
}
运行代码时,出现以下错误:

[5/17/17 19:21:02:704 SGT]000000 c4 SystemErr R javax.xml.ws.soap.SOAPFaultException:缺少会话标识符。此操作需要会话标识符。-->Microsoft.ReportingServices.Diagnostics.Utilities.MissingSessionIndexception:缺少会话标识符。此操作需要会话标识符

任何一位专家都能给我一个解决方案吗

另外,我曾尝试使用WSBindingProvider,如Surendra Gurjar的博客所示,它在Apache服务器上运行得很好,但当我将其部署到Websphere时,我遇到了ClassCastException