| Summary: | get NullPointerException when output xml schema | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Product: | z_Archived | Reporter: | Missing name <justin> | ||||||||||
| Component: | Eclipselink | Assignee: | Matt MacIvor <matt.macivor> | ||||||||||
| Status: | RESOLVED FIXED | QA Contact: | |||||||||||
| Severity: | normal | ||||||||||||
| Priority: | P2 | CC: | blaise.doughan, matt.macivor | ||||||||||
| Version: | unspecified | ||||||||||||
| Target Milestone: | --- | ||||||||||||
| Hardware: | PC | ||||||||||||
| OS: | Windows 7 | ||||||||||||
| Whiteboard: | |||||||||||||
| Attachments: |
|
||||||||||||
Created attachment 204601 [details]
proposed fix and test
The issue causing the null pointer has to do with the @XmlPath("email/@confirmed") where the attribute is being added to the email element, which already exists, but as a simple type.
After fixing this, it was revealed that schema generation for predicates in XmlPath wasn't working correctly. This patch addresses the issue with predicates as well as the original NullPointerException.
Created attachment 204614 [details]
updated fix and test
Updated patch, supports XmlPaths with multiple predicates.
Created attachment 204626 [details]
updated patch
Created attachment 204635 [details]
Updated Patch
Final patch has been submitted to SVN Will appear in 2.4 nightly builds. (In reply to comment #6) > Final patch has been submitted to SVN > Will appear in 2.4 nightly builds. Tested on eclipselink-2.4.0.v20111229-r10621.zip still get NullPointerException on the same code: java.lang.NullPointerException at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.getSchemaForNamespace(SchemaGenerator.java:660) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.getPrefixForNamespace(SchemaGenerator.java:701) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.buildAttribute(SchemaGenerator.java:1581) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.addToSchemaType(SchemaGenerator.java:478) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.populateSchemaTypes(SchemaGenerator.java:560) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.generateSchema(SchemaGenerator.java:145) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.generateSchema(SchemaGenerator.java:131) at org.eclipse.persistence.jaxb.compiler.Generator.generateSchemaFiles(Generator.java:220) at org.eclipse.persistence.jaxb.JAXBContext.generateSchema(JAXBContext.java:325) at org.eclipse.persistence.jaxb.JAXBContext.generateSchema(JAXBContext.java:290) at com.tungle.rest.model.MyWorldTest.testOutputSchema(MyWorldTest.java:80) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59) at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98) at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79) at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42) at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88) at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Have attempted running the provided test code against the latest EclipseLink 2.4, and don't see the NullPointerException. I get the following schema generated for MyWorld2.class: <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="myWorld2"> <xsd:sequence> <xsd:element name="email" minOccurs="0"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="confirmed" type="xsd:boolean"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> <xsd:element name="phones" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element name="phone" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="type" type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="name" type="xsd:string" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:schema> Is there anything different between the test case provided above and the test case that is causing the NullPointerException? Is there a package-info.java for MyBean2's package? Still unable to reproduce after the original fix. Unable to contact filer for more details. Marking as closed. Please re-open and provide more details to reproduce if the problem is still appearing the the latest builds. The Eclipselink project has moved to Github: https://github.com/eclipse-ee4j/eclipselink |
Build Identifier: Implementation-Version: 2.3.0.v20110604-r9504 (1) first create a simple java bean: @XmlRootElement(name="my-world2") public class MyWorld2 { private String name; private String email; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } private Boolean emailConfirmed; @XmlPath("email/@confirmed") public Boolean isEmailConfirmed() { return emailConfirmed; } public void setEmailConfirmed(Boolean emailConfirmed) { this.emailConfirmed = emailConfirmed; } private String homePhone; @XmlPath("phones/phone[@type='home']/text()") public String getHomePhone() { return homePhone; } public void setHomePhone(String homePhone) { this.homePhone = homePhone; } private String workPhone; @XmlPath("phones/phone[@type='work']/text()") public String getWorkPhone() { return workPhone; } public void setWorkPhone(String workPhone) { this.workPhone = workPhone; } (2) write test code : @Test public void testOutputSchema() throws Exception { final SchemaOutputResolver sor = new SchemaOutputResolver() { @Override public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException { return new StreamResult(System.out); } }; JAXBContext jc = JAXBContext.newInstance(MyWorld2.class); jc.generateSchema(sor); } (3) run test code and get this exception: java.lang.NullPointerException at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.buildSchemaComponentsForXPath(SchemaGenerator.java:1116) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.addXPathToSchema(SchemaGenerator.java:1391) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.addToSchemaType(SchemaGenerator.java:438) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.populateSchemaTypes(SchemaGenerator.java:547) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.generateSchema(SchemaGenerator.java:144) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.generateSchema(SchemaGenerator.java:130) at org.eclipse.persistence.jaxb.compiler.Generator.generateSchemaFiles(Generator.java:211) at org.eclipse.persistence.jaxb.JAXBContext.generateSchema(JAXBContext.java:235) at org.eclipse.persistence.jaxb.JAXBContext.generateSchema(JAXBContext.java:208) at com.tungle.rest.model.MyWorld2Test.testOutputSchema(MyWorld2Test.java:25) Reproducible: Always Steps to Reproduce: 1. first create a simple java bean: @XmlRootElement(name="my-world2") public class MyWorld2 { private String name; private String email; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } private Boolean emailConfirmed; @XmlPath("email/@confirmed") public Boolean isEmailConfirmed() { return emailConfirmed; } public void setEmailConfirmed(Boolean emailConfirmed) { this.emailConfirmed = emailConfirmed; } private String homePhone; @XmlPath("phones/phone[@type='home']/text()") public String getHomePhone() { return homePhone; } public void setHomePhone(String homePhone) { this.homePhone = homePhone; } private String workPhone; @XmlPath("phones/phone[@type='work']/text()") public String getWorkPhone() { return workPhone; } public void setWorkPhone(String workPhone) { this.workPhone = workPhone; } 2. write test code : @Test public void testOutputSchema() throws Exception { final SchemaOutputResolver sor = new SchemaOutputResolver() { @Override public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException { return new StreamResult(System.out); } }; JAXBContext jc = JAXBContext.newInstance(MyWorld2.class); jc.generateSchema(sor); } 3. run test code and get this exception: java.lang.NullPointerException at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.buildSchemaComponentsForXPath(SchemaGenerator.java:1116) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.addXPathToSchema(SchemaGenerator.java:1391) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.addToSchemaType(SchemaGenerator.java:438) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.populateSchemaTypes(SchemaGenerator.java:547) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.generateSchema(SchemaGenerator.java:144) at org.eclipse.persistence.jaxb.compiler.SchemaGenerator.generateSchema(SchemaGenerator.java:130) at org.eclipse.persistence.jaxb.compiler.Generator.generateSchemaFiles(Generator.java:211) at org.eclipse.persistence.jaxb.JAXBContext.generateSchema(JAXBContext.java:235) at org.eclipse.persistence.jaxb.JAXBContext.generateSchema(JAXBContext.java:208) at com.tungle.rest.model.MyWorld2Test.testOutputSchema(MyWorld2Test.java:25) 4. if I comment the property "emailConfirmed", then the unit test can output correct schema.