forked from loafle/openapi-generator-original
Simplified Jersey2 java client by letting Jersey do most serialization
and deserialization
This commit is contained in:
parent
d51746d7fa
commit
0f67be5590
@ -6,6 +6,7 @@ import javax.ws.rs.client.Entity;
|
|||||||
import javax.ws.rs.client.Invocation;
|
import javax.ws.rs.client.Invocation;
|
||||||
import javax.ws.rs.client.WebTarget;
|
import javax.ws.rs.client.WebTarget;
|
||||||
import javax.ws.rs.core.Form;
|
import javax.ws.rs.core.Form;
|
||||||
|
import javax.ws.rs.core.GenericType;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
import javax.ws.rs.core.Response.Status;
|
import javax.ws.rs.core.Response.Status;
|
||||||
@ -29,13 +30,11 @@ import java.util.TimeZone;
|
|||||||
|
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.text.ParseException;
|
|
||||||
|
|
||||||
import {{invokerPackage}}.auth.Authentication;
|
import {{invokerPackage}}.auth.Authentication;
|
||||||
import {{invokerPackage}}.auth.HttpBasicAuth;
|
import {{invokerPackage}}.auth.HttpBasicAuth;
|
||||||
@ -412,18 +411,39 @@ public class ApiClient {
|
|||||||
* Serialize the given Java object into string entity according the given
|
* Serialize the given Java object into string entity according the given
|
||||||
* Content-Type (only JSON is supported for now).
|
* Content-Type (only JSON is supported for now).
|
||||||
*/
|
*/
|
||||||
public Entity<String> serialize(Object obj, String contentType) throws ApiException {
|
public Entity<?> serialize(Object obj, Map<String, Object> formParams, String contentType) throws ApiException {
|
||||||
if (isJsonMime(contentType)) {
|
Entity<?> entity = null;
|
||||||
return Entity.json(json.serialize(obj));
|
if (contentType.startsWith("multipart/form-data")) {
|
||||||
|
MultiPart multiPart = new MultiPart();
|
||||||
|
for (Entry<String, Object> param: formParams.entrySet()) {
|
||||||
|
if (param.getValue() instanceof File) {
|
||||||
|
File file = (File) param.getValue();
|
||||||
|
FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey())
|
||||||
|
.fileName(file.getName()).size(file.length()).build();
|
||||||
|
multiPart.bodyPart(new FormDataBodyPart(contentDisp, file, MediaType.APPLICATION_OCTET_STREAM_TYPE));
|
||||||
|
} else {
|
||||||
|
FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()).build();
|
||||||
|
multiPart.bodyPart(new FormDataBodyPart(contentDisp, parameterToString(param.getValue())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
entity = Entity.entity(multiPart, MediaType.MULTIPART_FORM_DATA_TYPE);
|
||||||
|
} else if (contentType.startsWith("application/x-www-form-urlencoded")) {
|
||||||
|
Form form = new Form();
|
||||||
|
for (Entry<String, Object> param: formParams.entrySet()) {
|
||||||
|
form.param(param.getKey(), parameterToString(param.getValue()));
|
||||||
|
}
|
||||||
|
entity = Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE);
|
||||||
} else {
|
} else {
|
||||||
throw new ApiException(400, "can not serialize object into Content-Type: " + contentType);
|
// We let jersey handle the serialization
|
||||||
|
entity = Entity.entity(obj, contentType);
|
||||||
}
|
}
|
||||||
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deserialize response body to Java object according to the Content-Type.
|
* Deserialize response body to Java object according to the Content-Type.
|
||||||
*/
|
*/
|
||||||
public <T> T deserialize(Response response, TypeRef returnType) throws ApiException {
|
public <T> T deserialize(Response response, GenericType<T> returnType) throws ApiException {
|
||||||
String contentType = null;
|
String contentType = null;
|
||||||
List<Object> contentTypes = response.getHeaders().get("Content-Type");
|
List<Object> contentTypes = response.getHeaders().get("Content-Type");
|
||||||
if (contentTypes != null && !contentTypes.isEmpty())
|
if (contentTypes != null && !contentTypes.isEmpty())
|
||||||
@ -431,24 +451,7 @@ public class ApiClient {
|
|||||||
if (contentType == null)
|
if (contentType == null)
|
||||||
throw new ApiException(500, "missing Content-Type in response");
|
throw new ApiException(500, "missing Content-Type in response");
|
||||||
|
|
||||||
String body;
|
return response.readEntity(returnType);
|
||||||
if (response.hasEntity())
|
|
||||||
body = (String) response.readEntity(String.class);
|
|
||||||
else
|
|
||||||
body = "";
|
|
||||||
|
|
||||||
if (isJsonMime(contentType)) {
|
|
||||||
return json.deserialize(body, returnType);
|
|
||||||
} else if (returnType.getType().equals(String.class)) {
|
|
||||||
// Expecting string, return the raw response body.
|
|
||||||
return (T) body;
|
|
||||||
} else {
|
|
||||||
throw new ApiException(
|
|
||||||
500,
|
|
||||||
"Content type \"" + contentType + "\" is not supported for type: "
|
|
||||||
+ returnType.getType()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -466,7 +469,7 @@ public class ApiClient {
|
|||||||
* @param returnType The return type into which to deserialize the response
|
* @param returnType The return type into which to deserialize the response
|
||||||
* @return The response body in type of string
|
* @return The response body in type of string
|
||||||
*/
|
*/
|
||||||
public <T> T invokeAPI(String path, String method, List<Pair> queryParams, Object body, Map<String, String> headerParams, Map<String, Object> formParams, String accept, String contentType, String[] authNames, TypeRef returnType) throws ApiException {
|
public <T> T invokeAPI(String path, String method, List<Pair> queryParams, Object body, Map<String, String> headerParams, Map<String, Object> formParams, String accept, String contentType, String[] authNames, GenericType<T> returnType) throws ApiException {
|
||||||
updateParamsForAuth(authNames, queryParams, headerParams);
|
updateParamsForAuth(authNames, queryParams, headerParams);
|
||||||
|
|
||||||
WebTarget target = client.target(this.basePath).path(path);
|
WebTarget target = client.target(this.basePath).path(path);
|
||||||
@ -497,50 +500,16 @@ public class ApiClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Entity<?> formEntity = null;
|
Entity<?> entity = serialize(body, formParams, contentType);
|
||||||
|
|
||||||
if (contentType.startsWith("multipart/form-data")) {
|
|
||||||
MultiPart multiPart = new MultiPart();
|
|
||||||
for (Entry<String, Object> param: formParams.entrySet()) {
|
|
||||||
if (param.getValue() instanceof File) {
|
|
||||||
File file = (File) param.getValue();
|
|
||||||
FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey())
|
|
||||||
.fileName(file.getName()).size(file.length()).build();
|
|
||||||
multiPart.bodyPart(new FormDataBodyPart(contentDisp, file, MediaType.APPLICATION_OCTET_STREAM_TYPE));
|
|
||||||
} else {
|
|
||||||
FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()).build();
|
|
||||||
multiPart.bodyPart(new FormDataBodyPart(contentDisp, parameterToString(param.getValue())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
formEntity = Entity.entity(multiPart, MediaType.MULTIPART_FORM_DATA_TYPE);
|
|
||||||
} else if (contentType.startsWith("application/x-www-form-urlencoded")) {
|
|
||||||
Form form = new Form();
|
|
||||||
for (Entry<String, Object> param: formParams.entrySet()) {
|
|
||||||
form.param(param.getKey(), parameterToString(param.getValue()));
|
|
||||||
}
|
|
||||||
formEntity = Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE);
|
|
||||||
}
|
|
||||||
|
|
||||||
Response response = null;
|
Response response = null;
|
||||||
|
|
||||||
if ("GET".equals(method)) {
|
if ("GET".equals(method)) {
|
||||||
response = invocationBuilder.get();
|
response = invocationBuilder.get();
|
||||||
} else if ("POST".equals(method)) {
|
} else if ("POST".equals(method)) {
|
||||||
if (formEntity != null) {
|
response = invocationBuilder.post(entity);
|
||||||
response = invocationBuilder.post(formEntity);
|
|
||||||
} else if (body == null) {
|
|
||||||
response = invocationBuilder.post(null);
|
|
||||||
} else {
|
|
||||||
response = invocationBuilder.post(serialize(body, contentType));
|
|
||||||
}
|
|
||||||
} else if ("PUT".equals(method)) {
|
} else if ("PUT".equals(method)) {
|
||||||
if (formEntity != null) {
|
response = invocationBuilder.put(entity);
|
||||||
response = invocationBuilder.put(formEntity);
|
|
||||||
} else if (body == null) {
|
|
||||||
response = invocationBuilder.put(null);
|
|
||||||
} else {
|
|
||||||
response = invocationBuilder.put(serialize(body, contentType));
|
|
||||||
}
|
|
||||||
} else if ("DELETE".equals(method)) {
|
} else if ("DELETE".equals(method)) {
|
||||||
response = invocationBuilder.delete();
|
response = invocationBuilder.delete();
|
||||||
} else {
|
} else {
|
||||||
@ -579,6 +548,8 @@ public class ApiClient {
|
|||||||
private void buildClient() {
|
private void buildClient() {
|
||||||
final ClientConfig clientConfig = new ClientConfig();
|
final ClientConfig clientConfig = new ClientConfig();
|
||||||
clientConfig.register(MultiPartFeature.class);
|
clientConfig.register(MultiPartFeature.class);
|
||||||
|
clientConfig.register(json);
|
||||||
|
clientConfig.register(org.glassfish.jersey.jackson.JacksonFeature.class);
|
||||||
if (debugging) {
|
if (debugging) {
|
||||||
clientConfig.register(LoggingFilter.class);
|
clientConfig.register(LoggingFilter.class);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
package {{invokerPackage}};
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.*;
|
||||||
|
import com.fasterxml.jackson.databind.*;
|
||||||
|
import com.fasterxml.jackson.datatype.joda.*;
|
||||||
|
|
||||||
|
import java.text.DateFormat;
|
||||||
|
|
||||||
|
import javax.ws.rs.ext.ContextResolver;
|
||||||
|
|
||||||
|
{{>generatedAnnotation}}
|
||||||
|
public class JSON implements ContextResolver<ObjectMapper> {
|
||||||
|
private ObjectMapper mapper;
|
||||||
|
|
||||||
|
public JSON() {
|
||||||
|
mapper = new ObjectMapper();
|
||||||
|
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
|
||||||
|
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||||
|
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
|
||||||
|
mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
|
||||||
|
mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
|
||||||
|
mapper.registerModule(new JodaModule());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the date format for JSON (de)serialization with Date properties.
|
||||||
|
*/
|
||||||
|
public void setDateFormat(DateFormat dateFormat) {
|
||||||
|
mapper.setDateFormat(dateFormat);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ObjectMapper getContext(Class<?> type) {
|
||||||
|
return mapper;
|
||||||
|
}
|
||||||
|
}
|
@ -4,7 +4,8 @@ import {{invokerPackage}}.ApiException;
|
|||||||
import {{invokerPackage}}.ApiClient;
|
import {{invokerPackage}}.ApiClient;
|
||||||
import {{invokerPackage}}.Configuration;
|
import {{invokerPackage}}.Configuration;
|
||||||
import {{invokerPackage}}.Pair;
|
import {{invokerPackage}}.Pair;
|
||||||
import {{invokerPackage}}.TypeRef;
|
|
||||||
|
import javax.ws.rs.core.GenericType;
|
||||||
|
|
||||||
{{#imports}}import {{import}};
|
{{#imports}}import {{import}};
|
||||||
{{/imports}}
|
{{/imports}}
|
||||||
@ -83,7 +84,7 @@ public class {{classname}} {
|
|||||||
String[] {{localVariablePrefix}}authNames = new String[] { {{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}} };
|
String[] {{localVariablePrefix}}authNames = new String[] { {{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}} };
|
||||||
|
|
||||||
{{#returnType}}
|
{{#returnType}}
|
||||||
TypeRef {{localVariablePrefix}}returnType = new TypeRef<{{{returnType}}}>() {};
|
GenericType<{{{returnType}}}> {{localVariablePrefix}}returnType = new GenericType<{{{returnType}}}>() {};
|
||||||
return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType);
|
return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType);
|
||||||
{{/returnType}}{{^returnType}}
|
{{/returnType}}{{^returnType}}
|
||||||
{{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, null);
|
{{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, null);
|
||||||
|
@ -124,7 +124,12 @@
|
|||||||
<artifactId>jersey-media-multipart</artifactId>
|
<artifactId>jersey-media-multipart</artifactId>
|
||||||
<version>${jersey-version}</version>
|
<version>${jersey-version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.glassfish.jersey.media</groupId>
|
||||||
|
<artifactId>jersey-media-json-jackson</artifactId>
|
||||||
|
<version>2.22.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- JSON processing: jackson -->
|
<!-- JSON processing: jackson -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user