JAXBException: “paquet” ne marche pas contenir ObjectFactory.class ou jaxb.index

J'ai été jouer avec JAXB /MOXy beaucoup ces derniers temps, et il fonctionne très bien sur tous mes tests et exemple des codes. J'exclusivement à l'aide de la liaison de fichiers, c'est pourquoi je suis à l'aide de MOXy.

Veuillez noter que dans tous mes exemples, je ne suis JAMAIS à l'aide d'un ObjectFactory ni un jaxb.index, et il fonctionne très bien.

Quand je serai de retour à mon entreprise, je suis un méchant JAXB Exception disant que mon colis ne contient pas de ObjectFactory ou jaxb.index.

Mon projet met en jeu Spring et Hibernate, JUnit et DBUnit.

Voici un exemple de code: j'ai une classe abstraite appelée 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;
}
}

Vidéo de classe hérite de 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;
}
}

Voici mon fichier de liaison (il y a d'autres classes qui héritent de 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>

Et maintenant mon 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);
}

et dernier mais pas moins l'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

Plus d'infos :

  • Mon paquet de test (où j'ai ma classe de test JUnit) contient un jaxb.fichier de propriétés
  • Ma classe de test JUnit est vraiment un DBUnit /SpringJUnit de la classe, puisque je veux maréchal des objets à partir d'une base
  • De triage de DB ou de l'ordonnancement d'un objet simple (comme indiqué dans mon exemple) génèrent la même Exception
  • Et, bien sûr, l'ajout d'un jaxb.index dans le paquet ne change rien

Quatre yeux valent mieux que deux. Je ne suis pas ce que je fais mal. Si quelqu'un le voit, s'il vous plaît laissez-moi savoir.

Acclamations

OriginalL'auteur avi.elkharrat | 2014-10-29