Issue Details (XML | Word | Printable)

Key: HV-7
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: Major Major
Assignee: Unassigned
Reporter: Rakesh Kalra
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Hibernate Validator

Two level @Valid annotation doesn't work

Created: 20/Dec/06 05:30 PM   Updated: 20/Jul/09 09:43 AM   Resolved: 17/Jan/07 01:35 PM
Component/s: engine
Affects Version/s: Bundle 3.2.1
Fix Version/s: 3.0.0.ga

Time Tracking:
Original Estimate: 1 hour
Original Estimate - 1 hour
Remaining Estimate: 1 hour
Remaining Estimate - 1 hour
Time Spent: Not Specified
Time Spent - Not Specified

Environment:
hibernate-annotations 3.2.1.ga

Bug Testcase Reminder (view):
REMINDER: Bug reports should generally be accompanied by a test case
Participants: Emmanuel Bernard and Rakesh Kalra


 Description  « Hide

I have object depth of 3: Form, Member, Address. I get the following exception when initializing ClassValidator:

java.lang.NullPointerException
at org.hibernate.validator.ClassValidator.<init>(ClassValidator.java:142)
at org.hibernate.validator.ClassValidator.createChildValidator(ClassValidator.java:252)
at org.hibernate.validator.ClassValidator.initValidator(ClassValidator.java:216)
at org.hibernate.validator.ClassValidator.<init>(ClassValidator.java:149)
at org.hibernate.validator.ClassValidator.createChildValidator(ClassValidator.java:252)
at org.hibernate.validator.ClassValidator.initValidator(ClassValidator.java:216)
at org.hibernate.validator.ClassValidator.<init>(ClassValidator.java:134)
at org.hibernate.validator.ClassValidator.<init>(ClassValidator.java:105)
at org.hibernate.validator.ClassValidator.<init>(ClassValidator.java:97)
...

This works fine with 3.2.0.ga.

I think the problem is in the following constructor, where instance level "reflectionManager" is not being initialized.

protected ClassValidator(
XClass beanXClass, ResourceBundle resourceBundle, MessageInterpolator userInterpolator,
Map<XClass, ClassValidator> childClassValidators, ReflectionManager reflectionManager
) { this.beanClass = reflectionManager.toClass( beanXClass ); this.messageBundle = resourceBundle == null ? getDefaultResourceBundle() : resourceBundle; this.defaultMessageBundle = ResourceBundle.getBundle( DEFAULT_VALIDATOR_MESSAGE ); this.userInterpolator = userInterpolator; this.childClassValidators = childClassValidators; initValidator( beanXClass, childClassValidators ); }

The other constructor initializes reflectionManager.



Emmanuel Bernard added a comment - 20/Dec/06 05:57 PM

can you attach a runnable test case please


Rakesh Kalra added a comment - 21/Dec/06 04:08 PM

Here is an example which works with 3.2.0.ga, but fails with 3.2.1.ga:

<pre>
import org.hibernate.validator.ClassValidator;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.Valid;

public class HibernateValidatorTest {

public static void main(String[] args){ // ClassValidator construction fails with 3.2.1.ga. ClassValidator<Form> formValidator = new ClassValidator<Form>(Form.class); System.out.println("Test Passed"); }
}

class Form{

private Member member;

@Valid
public Member getMember(){ return member; }
}

class Member{

private Address address;

@Valid
public Address getAddress(){ return address; }
}

class Address{

private String city;

@NotNull
public String getCity(){ return city; }
}
</pre>

Here is the output:

<pre>
INFO: Hibernate Annotations 3.2.1.GA
Exception in thread "main" java.lang.NullPointerException
at org.hibernate.validator.ClassValidator.<init>(ClassValidator.java:142)
at org.hibernate.validator.ClassValidator.createChildValidator(ClassValidator.java:252)
at org.hibernate.validator.ClassValidator.initValidator(ClassValidator.java:216)
at org.hibernate.validator.ClassValidator.<init>(ClassValidator.java:149)
at org.hibernate.validator.ClassValidator.createChildValidator(ClassValidator.java:252)
at org.hibernate.validator.ClassValidator.initValidator(ClassValidator.java:216)
at org.hibernate.validator.ClassValidator.<init>(ClassValidator.java:134)
at org.hibernate.validator.ClassValidator.<init>(ClassValidator.java:105)
at org.hibernate.validator.ClassValidator.<init>(ClassValidator.java:97)
at HibernateValidatorTest.main(HibernateValidatorTest.java:9)
</pre>

IMHO, the fix is simply to initialize "reflectionManager" in the ClassValidator constructor.

Regards,
Rakesh


Emmanuel Bernard added a comment - 17/Jan/07 01:35 PM

Fixed thanks