Last active
August 29, 2015 14:17
-
-
Save OdaShinsuke/03ff80ac0fdd1268c537 to your computer and use it in GitHub Desktop.
Swagger JAX-RS BeanParam 用 Extensions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) {} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
com.wordnik:swagger-jaxrs:1.5.2-M1 ベースでの実装。
BeanParam の時は、各 Field を DefaultParameterExtension に流す
BeanParam でないときは、そのまま DefaultParameterExtension に流す