I have been playing with JAXB / MOXy a lot lately, and it works great on all my tests and example codes. I exclusively using binding files, that's why I'm using MOXy.
Please note that in all my examples, I'm NEVER using an ObjectFactory nor a jaxb.index, and it works GREAT.
When I get back to my business, I get a nasty JAXB Exception saying that my package does not contain an ObjectFactory or jaxb.index.
My project also invovles Spring and Hibernate, JUnit and DBUnit.
Here is some sample code: I have an abstract class called AContributionPhysicalSupport.
package org.pea.openVillages.pojo.contribution.implementation;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table(name = "TOV_CONTRIBUTION_PHYSICAL_SUPPORT")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "SUPPORT_TYPE", discriminatorType = DiscriminatorType.STRING, length = 20)
public abstract class AContributionPhysicalSupport implements Serializable
{
/* *****************************************************************
*
* PROPERTIES
*
* *****************************************************************
*/
/**
* for Serializable
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "SUPPORT_ID")
private Long physicalSupportId;
@Column(name = "SUPPORT_TYPE", nullable = false, length = 20, updatable = false, insertable = false)
private String supportType;
/* *****************************************************************
*
* CONSTRUCTORS
*
* *****************************************************************
*/
public AContributionPhysicalSupport()
{
}
/* *****************************************************************
*
* GETTERS AND SETTERS
*
* *****************************************************************
*/
/**
* @return the physicalSupportId
*/
public Long getPhysicalSupportId()
{
return physicalSupportId;
}
/**
* @param physicalSupportId
* the physicalSupportId to set
*/
public void setPhysicalSupportId(Long physicalSupportId)
{
this.physicalSupportId = physicalSupportId;
}
/**
* @return the supportType
*/
public String getSupportType()
{
return supportType;
}
/**
* @param supportType
* the supportType to set
*/
public void setSupportType(String supportType)
{
this.supportType = supportType;
}
/* *****************************************************************
*
* UTILS
*
* *****************************************************************
*/
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return this.getClass() + " [physicalSupportId=" + physicalSupportId + ", supportType=" + supportType + "]";
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((physicalSupportId == null) ? 0 : physicalSupportId.hashCode());
result = prime * result + ((supportType == null) ? 0 : supportType.hashCode());
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null)
{
return false;
}
if (!(obj instanceof AContributionPhysicalSupport))
{
return false;
}
AContributionPhysicalSupport other = (AContributionPhysicalSupport) obj;
if (physicalSupportId == null)
{
if (other.physicalSupportId != null)
{
return false;
}
}
else if (!physicalSupportId.equals(other.physicalSupportId))
{
return false;
}
if (supportType == null)
{
if (other.supportType != null)
{
return false;
}
}
else if (!supportType.equals(other.supportType))
{
return false;
}
return true;
}
}
Class Video inherits from AContributionPhysicalSupport :
package org.pea.openVillages.pojo.contribution.implementation;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "TOV_VIDEO")
@DiscriminatorValue("VIDEO")
public class Video extends AContributionPhysicalSupport
{
/* *****************************************************************
*
* PROPERTIES
*
* *****************************************************************
*/
/**
* for serializable
*/
private static final long serialVersionUID = 1L;
@Column(name = "VIDEO_TYPE", nullable = false, length = 20)
private String videoType;
@Column(name = "VIDEO_SIZE")
private Long videoSize;
@Column(name = "VIDEO_LENGTH")
private Long videoLength;
/* *****************************************************************
*
* CONSTRUCTORS
*
* *****************************************************************
*/
public Video()
{
super();
}
/* *****************************************************************
*
* GETTERS AND SETTERS
*
* *****************************************************************
*/
/**
* @return the videoType
*/
public String getVideoType()
{
return videoType;
}
/**
* @param videoType
* the videoType to set
*/
public void setVideoType(String videoType)
{
this.videoType = videoType;
}
/**
* @return the videoSize
*/
public Long getVideoSize()
{
return videoSize;
}
/**
* @param videoSize
* the videoSize to set
*/
public void setVideoSize(Long videoSize)
{
this.videoSize = videoSize;
}
/**
* @return the videoLength
*/
public Long getVideoLength()
{
return videoLength;
}
/**
* @param videoLength
* the videoLength to set
*/
public void setVideoLength(Long videoLength)
{
this.videoLength = videoLength;
}
/* *****************************************************************
*
* UTILS
*
* *****************************************************************
*/
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return super.toString() + " Video [videoType=" + videoType + ", videoSize=" + videoSize + ", videoLength="
+ videoLength + "]";
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((videoLength == null) ? 0 : videoLength.hashCode());
result = prime * result + ((videoSize == null) ? 0 : videoSize.hashCode());
result = prime * result + ((videoType == null) ? 0 : videoType.hashCode());
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (!super.equals(obj))
{
return false;
}
if (!(obj instanceof Video))
{
return false;
}
Video other = (Video) obj;
if (videoLength == null)
{
if (other.videoLength != null)
{
return false;
}
}
else if (!videoLength.equals(other.videoLength))
{
return false;
}
if (videoSize == null)
{
if (other.videoSize != null)
{
return false;
}
}
else if (!videoSize.equals(other.videoSize))
{
return false;
}
if (videoType == null)
{
if (other.videoType != null)
{
return false;
}
}
else if (!videoType.equals(other.videoType))
{
return false;
}
return true;
}
}
Here is my binding file (there are other classes inheriting from AContributionPhysicalSupport....)
<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="org.pea.openVillages.pojo.contribution.implementation">
<java-types>
<java-type name="AContributionPhysicalSupport">
<xml-root-element name="contribution-physical-support" />
<xml-type prop-order="physicalSupportId supportType" />
<java-attributes>
<xml-attribute java-attribute="physicalSupportId" name="support-id" />
<xml-element java-attribute="supportType" name="support-type" />
</java-attributes>
</java-type>
<java-type name="ExternalFileFormat">
<xml-root-element name="ext-file-format" />
<xml-type prop-order="fileType fileSize" />
<java-attributes>
<xml-element java-attribute="fileType" name="file-type" />
<xml-element java-attribute="fileSize" name="file-size" />
</java-attributes>
</java-type>
<java-type name="InternalFileFormat">
<xml-root-element name="int-file-format" />
<xml-type prop-order="fileSize" />
<java-attributes>
<xml-element java-attribute="fileSize" name="file-size" />
</java-attributes>
</java-type>
<java-type name="Video">
<xml-root-element name="video" />
<xml-type prop-order="videoType videoSize videoLength" />
<java-attributes>
<xml-element java-attribute="videoType" name="video-type" />
<xml-element java-attribute="videoSize" name="video-size" />
<xml-element java-attribute="videoLength" name="video-length" />
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
And now my test :
@Test
public void testYATMarshal() throws Exception
{
Video toto = new Video();
toto.setPhysicalSupportId(new Long(1));
toto.setSupportType("VIDEO");
toto.setVideoLength(new Long(358));
toto.setVideoSize(new Long(5775));
toto.setVideoType("avi");
FileReader videoBindFile = new FileReader(
"src/main/resources/xml-mapping/ContributionImpl-binding.xml");
List<Object> videoBindList = new ArrayList<Object>();
videoBindList.add(videoBindFile);
Map<String, List<Object>> videoMetaMap = new HashMap<String, List<Object>>();
videoMetaMap.put("org.pea.openVillages.pojo.contribution.implementation", videoBindList);
Map<String, Object> videoProperties = new HashMap<String, Object>();
videoProperties.put(JAXBContextProperties.OXM_METADATA_SOURCE, videoMetaMap);
JAXBContext context = JAXBContext.newInstance("org.pea.openVillages.pojo.contribution.implementation",
Video.class.getClassLoader(), videoProperties);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(toto, System.out);
}
and last but not least the Exception :
javax.xml.bind.JAXBException: Provider com.sun.xml.internal.bind.v2.ContextFactory could not be instantiated: javax.xml.bind.JAXBException: "org.pea.openVillages.pojo.contribution.implementation" doesnt contain ObjectFactory.class or jaxb.index
- with linked exception:
[javax.xml.bind.JAXBException: "org.pea.openVillages.pojo.contribution.implementation" doesnt contain ObjectFactory.class or jaxb.index]
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:146)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:347)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:431)
at org.pea.openVillages.dao.service.impl.ContributionDAOImplTest.testYATMarshal(ContributionDAOImplTest.java:187)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: javax.xml.bind.JAXBException: "org.pea.openVillages.pojo.contribution.implementation" doesnt contain ObjectFactory.class or jaxb.index
at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:216)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:172)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:132)
... 33 more
More info :
- My test package (where I have my JUnit test class) contains a jaxb.properties file
- My JUnit test class is really a DBUnit / SpringJUnit class, since I want to marshal objects from a DB
- Marshalling from DB or marshalling a simple object (like shown in my example) generate the same Exception
- And, of course, adding a jaxb.index in the package doesn't change anything
Four eyes are better than two. I'm not getting what I'm doing wrong. If somebody sees it, please let me know.
Cheers
Provider com.sun.xml.internal.bind.v2.ContextFactory could not be instantiated
- seems like you're not using MOXy but the built-in JAXB RI.
Please check the following post by Blaise:
See also the following question:
Does MOXy need anything special when using with schema-derived classes?
The answer provided by Lexicore in his comment did it for me!
I have setted the two packages as shown in Blaise's answer:
JAXBContext jc = JAXBContext.newInstance("com.example.pkg1:org.example.pkg2");
And that did it!
Thx man
来源:https://stackoverflow.com/questions/26642135/jaxbexception-package-doesnt-contain-objectfactory-class-or-jaxb-index