[笔记]写代码遇到的一些问题汇总下

本篇是用来填上一篇 挖下的坑的。

1.java调用webservice

有一些已有的webservice服务,由xfire生成发布,有些有参数,有些无参数,无参数的直接我直接使用org.codehaus.xfire这个包里的Client来动态生成客户端。然后调用就可以了。非常简单

Client client = null;try {client = new Client(new URL("http://leaver.me/testService?wsdl"));client.invoke("refreshAllCache", new Object[0]);} catch (MalformedURLException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}

但对于有参的,且是服务器自定义的类作为参数的时候,实在是搞不定。。不管是把自定义的类放到本地,包名一致,在invoke的时候生成这个对象还是其他什么方法。都无法完成。

最终换了直接发送soap报文来完成。dirty hack啊。如果你有一些好的方法希望不吝赐教。

解决方案来源自stackoverflow,因为stackoverflow现在国内好像有时候打不开。因此把代码贴过来。有疑问的话留言讨论。

import javax.xml.soap.*;import javax.xml.transform.*;import javax.xml.transform.stream.*;public class SOAPClientSAAJ {    /**     * Starting point for the SAAJ - SOAP Client Testing     */    public static void main(String args[]) {        try {            // Create SOAP Connection            SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();            SOAPConnection soapConnection = soapConnectionFactory.createConnection();            // Send SOAP Message to SOAP Server            String url = "http://ws.cdyne.com/emailverify/Emailvernotestemail.asmx";            SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);            // Process the SOAP Response            printSOAPResponse(soapResponse);            soapConnection.close();        } catch (Exception e) {            System.err.println("Error occurred while sending SOAP Request to Server");            e.printStackTrace();        }    }    private static SOAPMessage createSOAPRequest() throws Exception {        MessageFactory messageFactory = MessageFactory.newInstance();        SOAPMessage soapMessage = messageFactory.createMessage();        SOAPPart soapPart = soapMessage.getSOAPPart();        String serverURI = "http://ws.cdyne.com/";        // SOAP Envelope        SOAPEnvelope envelope = soapPart.getEnvelope();        envelope.addNamespaceDeclaration("example", serverURI);        /*        Constructed SOAP Request Message:                    mutantninja@gmail.com                    123         */        // SOAP Body        SOAPBody soapBody = envelope.getBody();        SOAPElement soapBodyElem = soapBody.addChildElement("VerifyEmail", "example");        SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("email", "example");        soapBodyElem1.addTextNode("mutantninja@gmail.com");        SOAPElement soapBodyElem2 = soapBodyElem.addChildElement("LicenseKey", "example");        soapBodyElem2.addTextNode("123");        MimeHeaders headers = soapMessage.getMimeHeaders();        headers.addHeader("SOAPAction", serverURI  + "VerifyEmail");        soapMessage.saveChanges();        /* Print the request message */        System.out.print("Request SOAP Message = ");        soapMessage.writeTo(System.out);        System.out.println();        return soapMessage;    }    /**     * Method used to print the SOAP Response     */    private static void printSOAPResponse(SOAPMessage soapResponse) throws Exception {        TransformerFactory transformerFactory = TransformerFactory.newInstance();        Transformer transformer = transformerFactory.newTransformer();        Source sourceContent = soapResponse.getSOAPPart().getContent();        System.out.print("\nResponse SOAP Message = ");        StreamResult result = new StreamResult(System.out);        transformer.transform(sourceContent, result);    }}

2.Access restriction on class due to restriction on required library rt.jar? 报错

总么都感觉是环境问题,系统bug。解决如下:

    进入project properties的 Build Path 设置里.移除 JRE System Library再添加回来,方法是: 选择 “Add Library” ,然后选择 JRE System Library.

3.SSHManager类报错:com.jcraft.jsch.JSchException: UnknownHostKey

我使用的一个SSHManager类如下:

package me.leaver.Util;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import java.util.logging.Level;import java.util.logging.Logger;import com.jcraft.jsch.Channel;import com.jcraft.jsch.ChannelExec;import com.jcraft.jsch.JSch;import com.jcraft.jsch.JSchException;import com.jcraft.jsch.Session;public class SSHManager {private static final Logger LOGGER = Logger.getLogger(SSHManager.class.getName());private JSch jschSSHChannel;private String strUserName;private String strConnectionIP;private int intConnectionPort;private String strPassword;private Session sesConnection;private int intTimeOut;private void doCommonConstructorActions(String userName, String password,String connectionIP, String knownHostsFileName) {jschSSHChannel = new JSch();try {jschSSHChannel.setKnownHosts(knownHostsFileName);} catch (JSchException jschX) {logError(jschX.getMessage());}strUserName = userName;strPassword = password;strConnectionIP = connectionIP;}public SSHManager(String userName, String password, String connectionIP,String knownHostsFileName) {doCommonConstructorActions(userName, password, connectionIP,knownHostsFileName);intConnectionPort = 22;intTimeOut = 60000;}public SSHManager(String userName, String password, String connectionIP,String knownHostsFileName, int connectionPort) {doCommonConstructorActions(userName, password, connectionIP,knownHostsFileName);intConnectionPort = connectionPort;intTimeOut = 60000;}public SSHManager(String userName, String password, String connectionIP,String knownHostsFileName, int connectionPort,int timeOutMilliseconds) {doCommonConstructorActions(userName, password, connectionIP,knownHostsFileName);intConnectionPort = connectionPort;intTimeOut = timeOutMilliseconds;}public String connect() {String errorMessage = null;try {sesConnection = jschSSHChannel.getSession(strUserName,strConnectionIP, intConnectionPort);Properties config = new Properties();config.put("StrictHostKeyChecking", "no");sesConnection.setConfig(config);sesConnection.setPassword(strPassword);sesConnection.connect(intTimeOut);} catch (JSchException jschX) {errorMessage = jschX.getMessage();}return errorMessage;}private String logError(String errorMessage) {if (errorMessage != null) {LOGGER.log(Level.SEVERE, "{0}:{1} - {2}", new Object[] {strConnectionIP, intConnectionPort, errorMessage });}return errorMessage;}private String logWarning(String warnMessage) {if (warnMessage != null) {LOGGER.log(Level.WARNING, "{0}:{1} - {2}", new Object[] {strConnectionIP, intConnectionPort, warnMessage });}return warnMessage;}public String sendCommand(String command) {StringBuilder outputBuffer = new StringBuilder();try {Channel channel = sesConnection.openChannel("exec");((ChannelExec) channel).setCommand(command);channel.connect();InputStream commandOutput = channel.getInputStream();int readByte = commandOutput.read();while (readByte != 0xffffffff) {outputBuffer.append((char) readByte);readByte = commandOutput.read();}channel.disconnect();} catch (IOException ioX) {logWarning(ioX.getMessage());return null;} catch (JSchException jschX) {logWarning(jschX.getMessage());return null;}return outputBuffer.toString();}public void close() {sesConnection.disconnect();}}

报这个错是因为

public String connect() {String errorMessage = null;try {sesConnection = jschSSHChannel.getSession(strUserName,strConnectionIP, intConnectionPort);Properties config = new Properties();config.put("StrictHostKeyChecking", "no");sesConnection.setConfig(config);sesConnection.setPassword(strPassword);sesConnection.connect(intTimeOut);} catch (JSchException jschX) {errorMessage = jschX.getMessage();}return errorMessage;}

连接这段代码里少了config.put(“StrictHostKeyChecking”, “no”);这段设置,这个是去掉了严格的安全检查,一般只用于测试目的。

4.navicat连接oracle数据库

之前使用PL/SQL操作Oracle数据库,使用Heidisql操作mysql数据库。。切换麻烦。而且PL/SQL搜索的时候中文有问题。于是打算使用navicat统一管理

方法是:

1.首先下载Instant Client 的32位版本和Navicat Premium

2.然后解压Instant Client,配置navicat

选择oci文件即可

然后新建oracle配置,选择basic模式,其他的根据你的数据库信息自己填写即可。

5.HttpClient的logger日志实在太多了

大人,实在太多了。看不过来啊。附赠一篇log4j配置文件详解

在log4j.properties文件中添加如下配置信息

log4j.logger.httpclient.wire.header=INFO

log4j.logger.httpclient.wire.content=INFO

log4j.logger.org.apache.commons.httpclient = INFO

6.其他

最后附赠一些实用的工具

http://www.freeformatter.com/ 程序员必备。各类转换,包括转义工具,格式校验工具。效果很好。

流体力学理论与F1赛车的空气动力学1,2,3 ? 什么雷诺数,伯努利方程,文丘里效应,当年木有好好学啊。这么高大上的东西果然还是有压力。

[笔记]写代码遇到的一些问题汇总下

相关文章:

你感兴趣的文章:

标签云: