Expanding on Blaise's answer, here is what my implementation looks like. This accomplishes using a transformer for a dynamic set of packages.
import org.eclipse.persistence.jaxb.metadata.MetadataSourceAdapter;
import org.eclipse.persistence.jaxb.xmlmodel.XmlBindings;
import org.eclipse.persistence.jaxb.xmlmodel.XmlSchema;
public class NameTransformerAdapter extends MetadataSourceAdapter {
private XmlBindings bindings;
/**
* @param packageName Fully qualified package name, like {@code com.example.test}
*/
public NameTransformerAdapter(String packageName) {
bindings = new XmlBindings();
bindings.setPackageName(packageName);
bindings.setXmlNameTransformer(XmlNameTransformer.class.getName());
bindings.setXmlSchema(new XmlSchema()); // this is necessary
}
@Override
public XmlBindings getXmlBindings(Map<String, ?> properties, ClassLoader classLoader) {
return bindings;
}
}
The transformer referenced is pretty simple:
import org.eclipse.persistence.oxm.XMLNameTransformer;
public class XmlNameTransformer implements XMLNameTransformer {
/** Uses capitalized name of class */
public String transformTypeName(String name) {
return name.substring(name.lastIndexOf('.') + 1);
}
public String transformElementName(String name) {
return name;
}
public String transformAttributeName(String name) {
return name;
}
public String transformRootElementName(String name) {
return transformTypeName(name);
}
}
Packages are determined at runtime and are tracked as such:
List<MetadataSource> adapters = new ArrayList<MetadataSource>();
adapters.add(new NameTransformerAdapter(packageName));
Lastly, a JAXBContext can be obtained using the above adapters:
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
private JAXBContext getContext(Class<?>[] classes) throws JAXBException {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, adapters);
return JAXBContextFactory.createContext(classes, properties);
}