cxfとjaxrsを使用してgzipを使用して圧縮されたcsv.fileを投稿しようとしています。
以下はサーバー側のコードです。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import org.kp.common.LogConstants;
import org.kp.util.LogHelper;
@Path("TestData")
public class TestDataResource {
@POST
@Produces("text/xml")
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
public Response postTestData( final @Multipart InputStream stream,
@Context HttpServletRequest request) {
boolean result = true;
LogHelper.setLog(LogConstants.INFO, request.getContentType());
LogHelper.setLog(LogConstants.INFO, request.getCharacterEncoding());
LogHelper.setLog(LogConstants.INFO, request.getHeader("charset"));
LogHelper.setLog(LogConstants.INFO, request.getHeader("Content-Encoding"));
LogHelper.setLog(LogConstants.INFO, request.getHeader("Content-Length"));
LogHelper.setLog(LogConstants.INFO, request.getHeader("Transfer-Encoding"));
writeToFile(stream);
return Response.status(result == true ? Status.OK : Status.EXPECTATION_FAILED).build();
}
private void writeToFile(InputStream inputStream) {
OutputStream outputStream = null;
try {
GZIPInputStream gzis = new GZIPInputStream(inputStream);
// write the inputStream to a FileOutputStream
outputStream = new FileOutputStream(new File(
"d:\\temp\\test.csv"));
IOUtils.copy(gzis, outputStream);
} catch (IOException ex) {
ex.printStackTrace();
}
finally{
try {
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
クライアント側のコードは以下のとおりです。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.ContentDisposition;
public class kpTest {
public static void main(String[] str) throws FileNotFoundException{
final String URL = "http://localhost:8080/kp_services/services/kpservices/TestData";
WebClient client = WebClient.create(URL);
//client.type(MediaType.APPLICATION_OCTET_STREAM);
client.type(MediaType.APPLICATION_OCTET_STREAM);
ContentDisposition cd = new ContentDisposition("attachment;filename=test.csv.gz");
List<Attachment> atts = new LinkedList<Attachment>();
InputStream stream = new FileInputStream("D:\\kp\\test.csv.gz");
Attachment att = new Attachment("root", stream, cd);
atts.add(att);
//Response response = client.post(new MultipartBody(att));
// or just post the attachment if it's a single part request only
// Response response = client.post(atts);
// or just use a file
//client.post(new File("D:\\kp\\test.csv"));
Response response = client.post(new File("D:\\kp\\test.csv.gz"));
System.out.println(response.getStatus());
}
}
上記のプログラムは正常に動作します。
Response response = client.post(new File("D:\\kp\\test.csv.gz"));
上記のコードから、ファイルを添付ファイルとして送信するのではなく、URL をエンコードして入力ストリームとして送信していると私は信じています。
上記の行にコメントを付けてコメントを外してコードを変更しようとすると
Response response = client.post(atts);
No message body writer is found というエラー メッセージが表示されます。サーバー側のコードを @Multipart InputStream stream
からリストの添付ファイルに変更しようとさえしています。それでも私は同じエラーをゲートします。メッセージ本文ライターのプロバイダーを追加する必要があります。問題を解決するのに役立つものがありますか。