@@ -2,8 +2,7 @@ package com.github.swagger.scala.converter
22
33import java .lang .annotation .Annotation
44import java .lang .reflect .ParameterizedType
5- import java .util .Iterator
6- import com .fasterxml .jackson .databind .JavaType
5+ import com .fasterxml .jackson .databind .{JavaType , ObjectMapper }
76import com .fasterxml .jackson .databind .`type` .ReferenceType
87import com .fasterxml .jackson .module .scala .introspect .{BeanIntrospector , PropertyDescriptor }
98import com .fasterxml .jackson .module .scala .{DefaultScalaModule , JsonScalaEnumeration }
@@ -22,11 +21,10 @@ import scala.util.control.NonFatal
2221class AnnotatedTypeForOption extends AnnotatedType
2322
2423object SwaggerScalaModelConverter {
25- val objectMapper = Json .mapper().registerModule(DefaultScalaModule )
24+ val objectMapper : ObjectMapper = Json .mapper().registerModule(DefaultScalaModule )
2625}
2726
2827class SwaggerScalaModelConverter extends ModelResolver (SwaggerScalaModelConverter .objectMapper) {
29- SwaggerScalaModelConverter
3028
3129 private val logger = LoggerFactory .getLogger(classOf [SwaggerScalaModelConverter ])
3230 private val VoidClass = classOf [Void ]
@@ -40,7 +38,7 @@ class SwaggerScalaModelConverter extends ModelResolver(SwaggerScalaModelConverte
4038 private val ProductClass = classOf [Product ]
4139 private val AnyClass = classOf [Any ]
4240
43- override def resolve (`type` : AnnotatedType , context : ModelConverterContext , chain : Iterator [ModelConverter ]): Schema [_] = {
41+ override def resolve (`type` : AnnotatedType , context : ModelConverterContext , chain : util. Iterator [ModelConverter ]): Schema [_] = {
4442 val javaType = _mapper.constructType(`type`.getType)
4543 val cls = javaType.getRawClass
4644
@@ -80,13 +78,12 @@ class SwaggerScalaModelConverter extends ModelResolver(SwaggerScalaModelConverte
8078 val introspector = BeanIntrospector (cls)
8179 val erasedProperties = ErasureHelper .erasedOptionalPrimitives(cls)
8280 introspector.properties.foreach { property =>
83- val propertyClass = getPropertyClass (property)
81+ val ( propertyClass, propertyAnnotations) = getPropertyClassAndAnnotations (property)
8482 val isOptional = isOption(propertyClass)
85- val propertyAnnotations = getPropertyAnnotations(property)
8683 val schemaOverrideClass = propertyAnnotations.collectFirst {
8784 case s : SchemaAnnotation if s.implementation() != VoidClass => s.implementation()
8885 }
89- if (schemaOverrideClass.isEmpty) {
86+ if (schemaOverrideClass.isEmpty && schema.getProperties != null ) {
9087 erasedProperties.get(property.name).foreach { erasedType =>
9188 val primitiveType = PrimitiveType .fromType(erasedType)
9289 if (primitiveType != null && isOptional) {
@@ -137,7 +134,9 @@ class SwaggerScalaModelConverter extends ModelResolver(SwaggerScalaModelConverte
137134 val propAsString = objectMapper.writeValueAsString(itemSchema)
138135 val correctedSchema = objectMapper.readValue(propAsString, primitiveProperty.getClass)
139136 correctedSchema.setType(primitiveProperty.getType)
140- correctedSchema.setFormat(primitiveProperty.getFormat)
137+ if (itemSchema.getFormat == null ) {
138+ correctedSchema.setFormat(primitiveProperty.getFormat)
139+ }
141140 correctedSchema
142141 }
143142
@@ -261,54 +260,30 @@ class SwaggerScalaModelConverter extends ModelResolver(SwaggerScalaModelConverte
261260 }
262261 }
263262
264- private def getPropertyClass (property : PropertyDescriptor ): Class [_] = {
263+ private def getPropertyClassAndAnnotations (property : PropertyDescriptor ): ( Class [_], Seq [ Annotation ]) = {
265264 property.param match {
266- case Some (constructorParameter) => {
265+ case Some (constructorParameter) =>
267266 val types = constructorParameter.constructor.getParameterTypes
268- if (constructorParameter.index > types.size) {
269- AnyClass
267+ val annotations = constructorParameter.constructor.getParameterAnnotations
268+ val index = constructorParameter.index
269+ if (index > types.size) {
270+ (AnyClass , Seq .empty)
270271 } else {
271- types(constructorParameter.index)
272+ val onlyType = types(index)
273+ val onlyAnnotations = if (index > annotations.size) { Seq .empty[Annotation ] } else { annotations(index).toIndexedSeq }
274+ (onlyType, onlyAnnotations)
272275 }
273- }
274- case _ => property.field match {
275- case Some (field) => field.getType
276- case _ => property.setter match {
277- case Some (setter) if setter.getParameterCount == 1 => {
278- setter.getParameterTypes()(0 )
279- }
280- case _ => property.beanSetter match {
281- case Some (setter) if setter.getParameterCount == 1 => {
282- setter.getParameterTypes()(0 )
283- }
284- case _ => AnyClass
285- }
286- }
287- }
288- }
289- }
290-
291- private def getPropertyAnnotations (property : PropertyDescriptor ): Seq [Annotation ] = {
292- property.param match {
293- case Some (constructorParameter) => {
294- val types = constructorParameter.constructor.getParameterAnnotations
295- if (constructorParameter.index > types.size) {
296- Seq .empty
297- } else {
298- types(constructorParameter.index).toSeq
299- }
300- }
301276 case _ => property.field match {
302- case Some (field) => field.getAnnotations.toSeq
277+ case Some (field) => ( field.getType, field. getAnnotations.toSeq)
303278 case _ => property.setter match {
304279 case Some (setter) if setter.getParameterCount == 1 => {
305- setter.getAnnotations(). toSeq
280+ ( setter.getParameterTypes()( 0 ), setter.getAnnotations. toSeq)
306281 }
307282 case _ => property.beanSetter match {
308283 case Some (setter) if setter.getParameterCount == 1 => {
309- setter.getAnnotations(). toSeq
284+ ( setter.getParameterTypes()( 0 ), setter.getAnnotations. toSeq)
310285 }
311- case _ => Seq .empty
286+ case _ => ( AnyClass , Seq .empty)
312287 }
313288 }
314289 }
0 commit comments