Opened https://hibernate.atlassian.net/browse/HV-928
thanks :) ________________________________ From: gunnar.morl...@googlemail.com <gunnar.morl...@googlemail.com> on behalf of Gunnar Morling <gun...@hibernate.org> Sent: Thursday, August 21, 2014 2:57 PM To: Itai Frenkel Cc: hibernate-dev@lists.jboss.org Subject: Re: [hibernate-dev] Possible bug in hibernate-validator ValidatorImpl Hi, 2014-08-21 12:38 GMT+02:00 Itai Frenkel <i...@forter.com<mailto:i...@forter.com>>: Hello, TL;DR: Need an opinion if to open a JIRA (since reproduction is very tricky) I am using the @UnwrapValidatedValue with a custom Guava OptionalUnwrapper and sometimes OptionalUnwrapper#getValidatedValueType() is called also for non-Optional<> fields. The bug reproduction is sporadic and tricky. If you say sporadic, does it mean validating one and the same POJO sometimes shows the issue and in some other cases it doesn't, without altering any parts of the code? I managed to pinpoint it to ValidatorImpl#setValidatedValueHandlerToValueContextIfPresent() that does not perform valueContext.setValidatedValueHandler( null ) when there is no need for an unwrapper. Since valueContext is re-used between fields, it is possible for the OptionalUnwrapper to be first called for Optional fields and then re-used for non-Optional fields with the same validatedValueHandler of the Optional field. Interesting, this doesn't seem correct indeed. Without having a closer look I'd say the un-wrapper should be reset on the context between validation of different properties. If the code owner could quickly comment on this, it would be great. It sounds like a legitimate bug description, so I suggest you move forward and open an issue in JIRA (https://hibernate.atlassian.net/browse/HV). It would be great if you could attach a complete executable test case which demonstrates the issue. below are some code snippets I used. public class SomePOJO { @DecimalMin(value="0", inclusive=true) public Integer x = -1; @UnwrapValidatedValue @DecimalMin(value="1", inclusive=true) public Optional<Integer> y = Optional.of(-1); @DecimalMin(value="0", inclusive=true) public Integer z = -1; } public class OptionalUnwrapper extends ValidatedValueUnwrapper<Optional<?>> { private final TypeResolver typeResolver; public OptionalUnwrapper() { typeResolver = new TypeResolver(); } @Override public Object handleValidatedValue(Optional<?> optional) { return optional == null? null : optional.orNull(); } @Override public Type getValidatedValueType(Type valueType) { final TypeToken<?> typeToken = TypeToken.of(valueType); if (typeToken.getRawType().isAssignableFrom(Optional.class)) { Type rawType = typeToken.resolveType(Optional.class.getTypeParameters()[0]).getType(); return rawType; } else { Type rawType = typeToken.getType(); Preconditions.checkArgument(false, "type " + rawType + " is not supported by " + this.getClass() ); return null; } } } Thanks for reporting this issue, much appreciated! Cheers, --Gunnar _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org<mailto:hibernate-dev@lists.jboss.org> https://lists.jboss.org/mailman/listinfo/hibernate-dev _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev