Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[eclipselink-users] MOXy/JAXB question regarding package-info

@XmlJavaTypeAdapter annotations can be used to specify XmlAdapter instances that can be used to map non-bindable classes to bindable JAXB classes.  What's even more convenient is that these annotations can be applied at the package level by placing them on the package-info.java file.  My question concerns: which package-info.java file does MOXy/JAXB consult, and how does it know which package-info.class files to hunt through for such annotations?

More precisely: Given an @XmlJavaTypeAdapter annotation found (somehow) on a package-info class (inside a wrapping @XmlJavaTypeAdapters annotation) with a correctly-specified type() attribute, is there any requirement that the type so specified in the annotation belong to the same package that is being annotated?

In other words, is this valid:

// package-info.java for com.whizbang.whatever:

@XmlJavaTypeAdapters({
  @XmlJavaTypeAdapter(type = com.foobar.bozo.Type.class,
                      value = com.fizbaw.adapters.SomeXmlAdapterSubclass.class)
})

package com.whizbang.whatever; // look; it's not com.foobar.bozo

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;

// end package-info.java

...?

Note that the package being annotated is com.whizbang.whatever, the package of the class specified as the @XmlJavaTypeAdapter's type() attribute is com.foobar.bozo, and the adapter class package (probably irrelevantly) is com.fizbaw.adapters.

I'm curious how JAXB implementations like MOXy go about locating this package-info to find the potential list of adapted classes.  I could see two conceptual approaches:
  1. Some sort of scanning for package-info.class resources.  I'm guessing this is not what happens?
  2. "Backing into" the package: JAXB encounters an object that needs to be marshaled, discovers it's not in the JAXBContext of the moment, and so investigates its package (Class#getPackage()) to see if that package has any helpful adapter annotations on it.  In this case, it would be an effective requirement that an @XmlJavaTypeAdapter annotation applied to a package-info.java file would need to specify a Class for its type() attribute that belonged to the same package as the one being annotated.
My larger context is that I'd like to simply have a package somewhere on the classpath--call it com.foobar.adapters--that has a package-info.java on it that "hosts" all known XmlJavaTypeAdapters for my enterprise application.  Some of these govern types that would obviously not be part of the com.foobar.adapters package.  I haven't yet tried this but I would think this might pose a problem.

This is obviously quite hard to articulate; I hope I've been clear in my questions.  Thanks for any help!

Best,
Laird

--
http://about.me/lairdnelson


Back to the top