Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save OdaShinsuke/03ff80ac0fdd1268c537 to your computer and use it in GitHub Desktop.
Save OdaShinsuke/03ff80ac0fdd1268c537 to your computer and use it in GitHub Desktop.
Swagger JAX-RS BeanParam 用 Extensions
package com.wordnik.swagger.jaxrs;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.ws.rs.BeanParam;
import com.wordnik.swagger.jaxrs.ext.SwaggerExtension;
import com.wordnik.swagger.jaxrs.utils.ParameterUtils;
import com.wordnik.swagger.models.parameters.Parameter;
public class DefatultParameterWithBeamParamExtensions implements SwaggerExtension {
@Override
public List<Parameter> extractParameters(Annotation[] annotations,
Class<?> cls, boolean isArray, Set<Class<?>> classesToSkip,
Iterator<SwaggerExtension> chain) {
DefaultParameterExtension defaultParameterExtension = new DefaultParameterExtension();
if(this.shouldIgnoreClass(cls))
return new ArrayList<Parameter>();
List<Parameter> parameters = new ArrayList<Parameter>();
for(Annotation annotation : annotations) {
if(annotation instanceof BeanParam) {
Field[] fields = cls.getDeclaredFields();
for (Field f : fields) {
Class<?> fCls = f.getType();
Type fType = f.getGenericType();
boolean fIsArray = ParameterUtils.isMethodArgumentAnArray(fCls, fType);
Annotation[] fAnnotations = f.getAnnotations();
parameters.addAll(defaultParameterExtension.extractParameters(fAnnotations, fCls, fIsArray, classesToSkip, chain));
}
}
else {
parameters.addAll(defaultParameterExtension.extractParameters(new Annotation[] { annotation }, cls, isArray, classesToSkip, chain));
}
}
return parameters;
}
@Override
public boolean shouldIgnoreClass(Class<?> cls) {
return false;
}
}
package com.wordnik.swagger.jaxrs;
import java.util.List;
import javax.ws.rs.BeanParam;
import javax.ws.rs.FormParam;
import javax.ws.rs.QueryParam;
import org.junit.Assert;
import org.junit.Test;
import com.wordnik.swagger.jaxrs.ext.SwaggerExtension;
import com.wordnik.swagger.jaxrs.ext.SwaggerExtensions;
import com.wordnik.swagger.models.Operation;
import com.wordnik.swagger.models.Swagger;
import com.wordnik.swagger.models.parameters.FormParameter;
import com.wordnik.swagger.models.parameters.Parameter;
import com.wordnik.swagger.models.parameters.QueryParameter;
public class DefaultParameterWithBeanParamExtensionsTest {
@Test
public void basicParam() throws NoSuchMethodException, SecurityException {
List<SwaggerExtension> extensions = SwaggerExtensions.getExtensions();
extensions.clear();
extensions.add(new DefatultParameterWithBeamParamExtensions());
Reader reader = new Reader(new Swagger());
Operation operation = reader.parseMethod(HogeResource.class.getMethod("notuseBeanParam", String.class, int.class));
List<Parameter> parameters = operation.getParameters();
Parameter param1 = parameters.get(0);
Assert.assertEquals(QueryParameter.class, param1.getClass());
Assert.assertEquals("name", param1.getName());
Parameter param2 = parameters.get(1);
Assert.assertEquals(FormParameter.class, param2.getClass());
Assert.assertEquals("id", param2.getName());
}
@Test
public void beanParam() throws NoSuchMethodException, SecurityException {
List<SwaggerExtension> extensions = SwaggerExtensions.getExtensions();
extensions.clear();
extensions.add(new DefatultParameterWithBeamParamExtensions());
Reader reader = new Reader(new Swagger());
Operation operation = reader.parseMethod(HogeResource.class.getMethod("useBeanParam", HogeBean.class));
List<Parameter> parameters = operation.getParameters();
Parameter param1 = parameters.get(0);
Assert.assertEquals(QueryParameter.class, param1.getClass());
Assert.assertEquals("name", param1.getName());
Parameter param2 = parameters.get(1);
Assert.assertEquals(FormParameter.class, param2.getClass());
Assert.assertEquals("id", param2.getName());
}
public static class HogeBean {
@QueryParam("name")
private String name;
@FormParam("id")
private int id;
}
public static class HogeResource {
public void useBeanParam(@BeanParam HogeBean bean) {}
public void notuseBeanParam(@QueryParam("name") String name, @FormParam("id") int id) {}
}
}
@OdaShinsuke
Copy link
Author

com.wordnik:swagger-jaxrs:1.5.2-M1 ベースでの実装。
BeanParam の時は、各 Field を DefaultParameterExtension に流す
BeanParam でないときは、そのまま DefaultParameterExtension に流す

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment