-4

私はJavaが初めてで、XMLファイルをHTTPサーバーに送信することになっています。XML ファイルは最初に文字列に変換する必要があります。

サーバーからエラーが発生しています:

[stdout] (http--127.0.0.1-8080-1) failed in postjava.lang.NullPointerException

[stdout] (http--127.0.0.1-8080-1) received post request :

サーバーに何も送信していないようです。

ここにコードがあります

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.w3c.dom.Document;


public class try_post {

    public static void main(String[] args) {

        try{
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));


            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();

            Document doc = builder.parse("D:\\n.xml");
            StringWriter stringWriter = new StringWriter(); 

            Transformer transformer =TransformerFactory.newInstance().newTransformer(); 

            transformer.transform(new DOMSource(doc), new StreamResult(stringWriter)); 
            String strFileContent = stringWriter.toString();  
            System.out.println(strFileContent);
            System.out.println( strFileContent.getClass().getName());
            System.out.println("xml file converted to string"); 

            String param="param1=" + URLEncoder.encode(strFileContent ,"UTF-8");

            URL url = new URL("http://localhost:8080/");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setDoOutput(true);
            //      connection.setInstanceFollowRedirects(false);
            connection.setRequestMethod("POST");

            connection.setFixedLengthStreamingMode(param.getBytes().length);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());

            writer.write(param);
            writer.flush();

            String line;
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            writer.close();
            reader.close();

            String response= "";


            StreamSource source = new StreamSource(fileReader);
            StreamResult result = new StreamResult(os);
            transformer.transform(source, result);*/



            DataOutputStream fos = new DataOutputStream(connection.getOutputStream ());

            System.out.println("Response code: " + connection.getResponseCode());
            connection.disconnect();}
        catch (MalformedURLException ex) {
            System.out.print("MalformedURLException");

        } catch (Exception ex) {
            System.out.print(" Exception: "+ex.getMessage());

        }

    }

}
4

4 に答える 4

3

あなたが投稿した内容に基づいて誰も助けることはできません。スタック トレースにはこれ以上のものが必要です。

コードには多くの問題があります。

  1. メッセージだけでなく、スタック トレースを出力します。より多くの情報が得られます。
  2. 最初に null かどうかを確認せずに接続オブジェクトを使用します。それはそれかもしれません。
  3. その Document オブジェクトと同じです。XML が読み取られたことをどのように確認できますか?

ファイルから XML を読み取り、ローカルホストでリッスンしているサーブレットに POST しようとしているようです。応答コードを確認するだけです。私は何を取りこぼしたか?

あなたは私の好みでは十分に防御的ではありません。あなたが問題を抱えているのも不思議ではありません。

次のように、スタック トレースを出力します。

    catch (MalformedURLException ex) {
        ex.printStackTrace();
    } catch (Exception ex) {
        ex.printStackTrace();
    }

IntelliJ などの IDE で実行し、デバッガーを使用してコードをステップ実行することも賢明です。ここで回答を待っていたよりも短い時間で NPE を取得している理由がわかります。

于 2013-01-24T00:02:16.837 に答える
2

ああなるほど。Rubyを使用するだけです。

require "net/http"; require "uri"
params = { param1: File.read("D:\\n.xml") }
uri = URI.parse("http://localhost:8080/")
resp = Net::HTTP.post_form(uri, params)
puts "Response code: #{resp.code}"

すみません、やらなければなりませんでした。*反対票用の中括弧*

于 2013-01-24T00:28:19.410 に答える
1

コードではなく、サーバー側で例外が発生しています。例外スタック トレースはサーバーに記録されていますか? これをデバッグするには、サーバー側のコードを確認する必要がある場合があります。

于 2013-01-24T00:48:42.197 に答える
0

私が見る限り、あなたは難しいことをやっています。HTTPClient ライブラリを使用してみてください。これにより、コードが大幅に簡素化されます。

Maven の依存関係については、 http ://search.maven.org/#artifactdetails%7Ccommons-httpclient%7Ccommons-httpclient%7C3.1%7Cjar を参照してください。

実際のコード例については、次を参照してください: http://www.kodejava.org/browse/47.htmlを参照してください。

于 2013-01-24T00:08:19.807 に答える