如何使用 RestEasy 框架发送多部分响应
How to send Multipart response using RestEasy framework
我正在尝试实现接受 json 字符串并根据密钥获取 .zip 文件的网络服务。
然后我需要发送 .zip 文件和捆绑在多部分数据中的 json 字符串。
所以基本上我的回应应该是一个包含两部分的多部分对象
1) .zip file
2) json string
这是我当前的代码
public class ContentRepo {
@POST
@Path("/fetchModel")
@Consumes("application/json")
@Produces("multipart/mixed")
public Response getContent(String strJson)
{
Response response = null;
try{
JSONObject objJson = new JSONObject(strJson);
String strAssetName = objJson.getString("assetName");
if(null != strAssetName){
Client client = ClientBuilder.newClient();
ResteasyClient restEasyClient = (ResteasyClient) client;
ResteasyWebTarget target = restEasyClient.target("http://localhost:8091/ContentServer/").path("fetchModel");
response = target.request()
.post(Entity.entity(getMultiPartData("Car"), MediaType.MULTIPART_FORM_DATA));
}
}catch(Exception ex){
ex.printStackTrace();
}
return response;
}
public MultipartFormDataOutput getMultiPartData(String strAssetName){
MultipartFormDataOutput objMultiPartData = new MultipartFormDataOutput();
JSONObject objJson = new JSONObject();
try{
if(strAssetName.equalsIgnoreCase("Car")){
//car assets
try {
objMultiPartData.addFormData("file", new FileBody(new File("D:/programs/content_server/Car/Car.zip")), MediaType.APPLICATION_OCTET_STREAM_TYPE);
objJson.put("png", "car");
objMultiPartData.addFormData("mapping", new StringBody(objJson.toString()), MediaType.APPLICATION_JSON_TYPE);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}catch(Exception ex){
ex.printStackTrace();
}
return objMultiPartData;
}
}
但是,当 运行 以上时,我无法获取多部分响应。相反得到下面的异常
Caused by: java.lang.NoSuchMethodError: org.jboss.resteasy.spi.ResteasyProviderFactory.<init>(Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)V
at org.jboss.resteasy.client.jaxrs.internal.ClientConfiguration.<init>(ClientConfiguration.java:44)
at org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder.build(ResteasyClientBuilder.java:347)
at org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder.build(ResteasyClientBuilder.java:52)
at javax.ws.rs.client.ClientBuilder.newClient(ClientBuilder.java:114)
at com.app.wikicontent.WikitudeContentRepo.getARModel(WikitudeContentRepo.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:155)
at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:257)
at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:222)
at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:211)
at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:525)
... 25 more
您的堆栈跟踪抱怨找不到 ResteasyProvider
constructor that was not introduced until org.jboss.resteasy:resteasy-jaxrs
version 3.0 in order to support org.jboss.resteasy:resteasy-client
。因此,您的运行时类路径中某处可能有旧版本的 resteasy-jaxrs
。删除它并确保您部署的应用程序的 resteasy-jaxrs
和 resteasy-client
版本同步。
我正在尝试实现接受 json 字符串并根据密钥获取 .zip 文件的网络服务。
然后我需要发送 .zip 文件和捆绑在多部分数据中的 json 字符串。
所以基本上我的回应应该是一个包含两部分的多部分对象
1) .zip file
2) json string
这是我当前的代码
public class ContentRepo {
@POST
@Path("/fetchModel")
@Consumes("application/json")
@Produces("multipart/mixed")
public Response getContent(String strJson)
{
Response response = null;
try{
JSONObject objJson = new JSONObject(strJson);
String strAssetName = objJson.getString("assetName");
if(null != strAssetName){
Client client = ClientBuilder.newClient();
ResteasyClient restEasyClient = (ResteasyClient) client;
ResteasyWebTarget target = restEasyClient.target("http://localhost:8091/ContentServer/").path("fetchModel");
response = target.request()
.post(Entity.entity(getMultiPartData("Car"), MediaType.MULTIPART_FORM_DATA));
}
}catch(Exception ex){
ex.printStackTrace();
}
return response;
}
public MultipartFormDataOutput getMultiPartData(String strAssetName){
MultipartFormDataOutput objMultiPartData = new MultipartFormDataOutput();
JSONObject objJson = new JSONObject();
try{
if(strAssetName.equalsIgnoreCase("Car")){
//car assets
try {
objMultiPartData.addFormData("file", new FileBody(new File("D:/programs/content_server/Car/Car.zip")), MediaType.APPLICATION_OCTET_STREAM_TYPE);
objJson.put("png", "car");
objMultiPartData.addFormData("mapping", new StringBody(objJson.toString()), MediaType.APPLICATION_JSON_TYPE);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}catch(Exception ex){
ex.printStackTrace();
}
return objMultiPartData;
}
}
但是,当 运行 以上时,我无法获取多部分响应。相反得到下面的异常
Caused by: java.lang.NoSuchMethodError: org.jboss.resteasy.spi.ResteasyProviderFactory.<init>(Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)V
at org.jboss.resteasy.client.jaxrs.internal.ClientConfiguration.<init>(ClientConfiguration.java:44)
at org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder.build(ResteasyClientBuilder.java:347)
at org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder.build(ResteasyClientBuilder.java:52)
at javax.ws.rs.client.ClientBuilder.newClient(ClientBuilder.java:114)
at com.app.wikicontent.WikitudeContentRepo.getARModel(WikitudeContentRepo.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:155)
at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:257)
at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:222)
at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:211)
at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:525)
... 25 more
您的堆栈跟踪抱怨找不到 ResteasyProvider
constructor that was not introduced until org.jboss.resteasy:resteasy-jaxrs
version 3.0 in order to support org.jboss.resteasy:resteasy-client
。因此,您的运行时类路径中某处可能有旧版本的 resteasy-jaxrs
。删除它并确保您部署的应用程序的 resteasy-jaxrs
和 resteasy-client
版本同步。