Skip to content

Commit

Permalink
Merge pull request #7 from tedliang/fixViolationPathForContainerEleme…
Browse files Browse the repository at this point in the history
…ntNode

Handle violation path for container element node
  • Loading branch information
tedliang authored Nov 27, 2021
2 parents 2e56244 + 99e1326 commit 30c5ee6
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


class ValidatingValueInstantiator extends AbstractDelegatingValueInstantiator {
Expand Down Expand Up @@ -215,7 +217,6 @@ private boolean allParametersHaveViolations(
return true;
}


@Nonnull
private ConstraintViolation<?> mapParameterViolation(
ConstraintViolation<?> violation,
Expand All @@ -233,6 +234,12 @@ private ConstraintViolation<?> mapParameterViolation(
} else {
propertyName = constructorArguments[parameterIndex].getName();
}

Matcher containerIndex = Pattern.compile("\\[.*\\]").matcher(parameterNode.toString());
if (containerIndex.find()) {
propertyName += containerIndex.group();
}

Path newPath = PathBuilder.create()
.appendBeanNode()
.appendProperty(propertyName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,13 @@ import org.junit.jupiter.params.provider.ArgumentsProvider
import org.junit.jupiter.params.provider.ArgumentsSource
import org.unbrokendome.jackson.beanvalidation.assertions.hasViolation
import java.util.stream.Stream
import javax.validation.Constraint
import javax.validation.ConstraintValidator
import javax.validation.ConstraintValidatorContext
import javax.validation.Payload
import javax.validation.constraints.NotNull
import kotlin.annotation.AnnotationTarget.VALUE_PARAMETER
import kotlin.reflect.KClass


class KotlinValidationTest : AbstractValidationTest() {
Expand Down Expand Up @@ -220,4 +226,39 @@ class KotlinValidationTest : AbstractValidationTest() {
assertThat(violations).hasViolation<NotNull>("nested[2].value")
}
}


@JsonValidated
data class ContainerIndexBean(@UniqueData val nested: List<SimpleData>)

@Target(VALUE_PARAMETER)
@Constraint(validatedBy = [UniqueDataValidator::class])
annotation class UniqueData(
val message: String = "Duplicated value",
val groups: Array<KClass<*>> = [],
val payload: Array<KClass<out Payload>> = [],
)

class UniqueDataValidator : ConstraintValidator<UniqueData, List<SimpleData>> {
override fun isValid(list: List<SimpleData>, context: ConstraintValidatorContext): Boolean {
context.disableDefaultConstraintViolation()
context.buildConstraintViolationWithTemplate("Duplicated value")
.addPropertyNode("value")
.inContainer(List::class.java, 0)
.inIterable().atIndex(1)
.addConstraintViolation()
return false
}
}

@Test
fun `should report violation on container element node`() {

val json = """{ "nested": [{"value":"test"}, {"value":"test"}] }"""

val violations = assertViolationsOnDeserialization<ContainerIndexBean>(json)

assertThat(violations).hasSize(1)
assertThat(violations).hasViolation<UniqueData>("nested[1].value")
}
}

0 comments on commit 30c5ee6

Please sign in to comment.