Loading src/main/scala/com/kjetland/jackson/jsonSchema/JsonSchemaGenerator.scala +7 −1 Original line number Diff line number Diff line Loading @@ -4,7 +4,7 @@ import java.lang.reflect.{Field, Method, ParameterizedType} import java.time.{LocalDate, LocalDateTime, LocalTime, OffsetDateTime} import java.util import java.util.Optional import javax.validation.constraints.{Max, Min, NotNull, Size} import javax.validation.constraints.{Pattern, Max, Min, NotNull, Size} import com.fasterxml.jackson.annotation.{JsonSubTypes, JsonTypeInfo} import com.fasterxml.jackson.core.JsonParser.NumberType Loading Loading @@ -228,6 +228,12 @@ class JsonSchemaGenerator val minAndMaxLength:Option[MinAndMaxLength] = currentProperty.flatMap { p => // Look for @Pattern Option(p.getAnnotation(classOf[Pattern])).map { pattern => node.put("pattern", pattern.regexp()) } // Look for @Size Option(p.getAnnotation(classOf[Size])) .map { Loading src/test/scala/com/kjetland/jackson/jsonSchema/JsonSchemaGeneratorTest.scala +14 −6 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ package com.kjetland.jackson.jsonSchema import java.time.{LocalDate, LocalDateTime, OffsetDateTime} import java.util import java.util.{Optional, TimeZone} import javax.validation.constraints.{Max, Min, NotNull, Size} import javax.validation.constraints.{Pattern, Max, Min, NotNull, Size} import com.fasterxml.jackson.annotation.{JsonProperty, JsonSubTypes, JsonTypeInfo, JsonValue} import com.fasterxml.jackson.databind.annotation.JsonDeserialize Loading Loading @@ -77,7 +77,7 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers { node => val r = schemaValidator.validate(node) if ( !r.isSuccess ) { throw new Exception("json does not validate agains schema: " + r) throw new Exception("json does not validate against schema: " + r) } } Loading Loading @@ -609,16 +609,18 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers { val schema = generateAndValidateSchema(jsonSchemaGeneratorScalaHTML5, testData.classUsingValidation.getClass, Some(jsonNode)) assert(schema.at("/properties/stringUsingNotNull/minLength").asInt() == 1) assert(schema.at("/properties/stringUsingNotNull/maxLength").isMissingNode == true) assert(schema.at("/properties/stringUsingNotNull/maxLength").isMissingNode) assert(schema.at("/properties/stringUsingSize/minLength").asInt() == 1) assert(schema.at("/properties/stringUsingSize/maxLength").asInt() == 20) assert(schema.at("/properties/stringUsingSizeOnlyMin/minLength").asInt() == 1) assert(schema.at("/properties/stringUsingSizeOnlyMin/maxLength").isMissingNode == true) assert(schema.at("/properties/stringUsingSizeOnlyMin/maxLength").isMissingNode) assert(schema.at("/properties/stringUsingSizeOnlyMax/maxLength").asInt() == 30) assert(schema.at("/properties/stringUsingSizeOnlyMax/minLength").isMissingNode == true) assert(schema.at("/properties/stringUsingSizeOnlyMax/minLength").isMissingNode) assert(schema.at("/properties/stringUsingPattern/pattern").asText() == "_stringUsingPatternA|_stringUsingPatternB") assert(schema.at("/properties/intMin/minimum").asInt() == 1) assert(schema.at("/properties/intMax/maximum").asInt() == 10) Loading Loading @@ -714,7 +716,10 @@ trait TestData { val pojoUsingFormat = new PojoUsingFormat("test@example.com", true, OffsetDateTime.now(), OffsetDateTime.now()) val manyDates = ManyDates(LocalDateTime.now(), OffsetDateTime.now(), LocalDate.now(), org.joda.time.LocalDate.now()) val classUsingValidation = ClassUsingValidation("_stringUsingNotNull", "_stringUsingSize", "_stringUsingSizeOnlyMin", "_stringUsingSizeOnlyMax", 1, 2, 1.0, 2.0 ) val classUsingValidation = ClassUsingValidation( "_stringUsingNotNull", "_stringUsingSize", "_stringUsingSizeOnlyMin", "_stringUsingSizeOnlyMax", "_stringUsingPatternA", 1, 2, 1.0, 2.0 ) } Loading Loading @@ -784,6 +789,9 @@ case class ClassUsingValidation @Size(max=30) stringUsingSizeOnlyMax:String, @Pattern(regexp = "_stringUsingPatternA|_stringUsingPatternB") stringUsingPattern:String, @Min(1) intMin:Int, @Max(10) Loading Loading
src/main/scala/com/kjetland/jackson/jsonSchema/JsonSchemaGenerator.scala +7 −1 Original line number Diff line number Diff line Loading @@ -4,7 +4,7 @@ import java.lang.reflect.{Field, Method, ParameterizedType} import java.time.{LocalDate, LocalDateTime, LocalTime, OffsetDateTime} import java.util import java.util.Optional import javax.validation.constraints.{Max, Min, NotNull, Size} import javax.validation.constraints.{Pattern, Max, Min, NotNull, Size} import com.fasterxml.jackson.annotation.{JsonSubTypes, JsonTypeInfo} import com.fasterxml.jackson.core.JsonParser.NumberType Loading Loading @@ -228,6 +228,12 @@ class JsonSchemaGenerator val minAndMaxLength:Option[MinAndMaxLength] = currentProperty.flatMap { p => // Look for @Pattern Option(p.getAnnotation(classOf[Pattern])).map { pattern => node.put("pattern", pattern.regexp()) } // Look for @Size Option(p.getAnnotation(classOf[Size])) .map { Loading
src/test/scala/com/kjetland/jackson/jsonSchema/JsonSchemaGeneratorTest.scala +14 −6 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ package com.kjetland.jackson.jsonSchema import java.time.{LocalDate, LocalDateTime, OffsetDateTime} import java.util import java.util.{Optional, TimeZone} import javax.validation.constraints.{Max, Min, NotNull, Size} import javax.validation.constraints.{Pattern, Max, Min, NotNull, Size} import com.fasterxml.jackson.annotation.{JsonProperty, JsonSubTypes, JsonTypeInfo, JsonValue} import com.fasterxml.jackson.databind.annotation.JsonDeserialize Loading Loading @@ -77,7 +77,7 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers { node => val r = schemaValidator.validate(node) if ( !r.isSuccess ) { throw new Exception("json does not validate agains schema: " + r) throw new Exception("json does not validate against schema: " + r) } } Loading Loading @@ -609,16 +609,18 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers { val schema = generateAndValidateSchema(jsonSchemaGeneratorScalaHTML5, testData.classUsingValidation.getClass, Some(jsonNode)) assert(schema.at("/properties/stringUsingNotNull/minLength").asInt() == 1) assert(schema.at("/properties/stringUsingNotNull/maxLength").isMissingNode == true) assert(schema.at("/properties/stringUsingNotNull/maxLength").isMissingNode) assert(schema.at("/properties/stringUsingSize/minLength").asInt() == 1) assert(schema.at("/properties/stringUsingSize/maxLength").asInt() == 20) assert(schema.at("/properties/stringUsingSizeOnlyMin/minLength").asInt() == 1) assert(schema.at("/properties/stringUsingSizeOnlyMin/maxLength").isMissingNode == true) assert(schema.at("/properties/stringUsingSizeOnlyMin/maxLength").isMissingNode) assert(schema.at("/properties/stringUsingSizeOnlyMax/maxLength").asInt() == 30) assert(schema.at("/properties/stringUsingSizeOnlyMax/minLength").isMissingNode == true) assert(schema.at("/properties/stringUsingSizeOnlyMax/minLength").isMissingNode) assert(schema.at("/properties/stringUsingPattern/pattern").asText() == "_stringUsingPatternA|_stringUsingPatternB") assert(schema.at("/properties/intMin/minimum").asInt() == 1) assert(schema.at("/properties/intMax/maximum").asInt() == 10) Loading Loading @@ -714,7 +716,10 @@ trait TestData { val pojoUsingFormat = new PojoUsingFormat("test@example.com", true, OffsetDateTime.now(), OffsetDateTime.now()) val manyDates = ManyDates(LocalDateTime.now(), OffsetDateTime.now(), LocalDate.now(), org.joda.time.LocalDate.now()) val classUsingValidation = ClassUsingValidation("_stringUsingNotNull", "_stringUsingSize", "_stringUsingSizeOnlyMin", "_stringUsingSizeOnlyMax", 1, 2, 1.0, 2.0 ) val classUsingValidation = ClassUsingValidation( "_stringUsingNotNull", "_stringUsingSize", "_stringUsingSizeOnlyMin", "_stringUsingSizeOnlyMax", "_stringUsingPatternA", 1, 2, 1.0, 2.0 ) } Loading Loading @@ -784,6 +789,9 @@ case class ClassUsingValidation @Size(max=30) stringUsingSizeOnlyMax:String, @Pattern(regexp = "_stringUsingPatternA|_stringUsingPatternB") stringUsingPattern:String, @Min(1) intMin:Int, @Max(10) Loading