我正在尝试为Jerseyjavax.xml.bind.annotation.adapters.XmlAdapter
中的类型配置“系统范围”自定义。java.util.Locale
在我控制的类上使用它很容易,@XmlJavaTypeAdapter
但情况并非总是如此(我无法注释的第 3 方代码)。
这似乎是一个很常见的问题,但我找不到任何好的例子或文档来说明如何处理它。
那么,有可能吗?
谢谢!
如果您需要对无法修改的类进行注释,则始终可以使用EclipseLink JAXB (MOXy)的外部化元数据功能。
元数据文件看起来像:
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm">
<java-types>
<java-type name="java.util.Locale">
<xml-java-type-adapter value="some.package.YourAdapter"/>
</java-type>
</java-types>
</xml-bindings>
对于 EclipseLink MOXy,您需要在模型类中添加一个 jaxb.properties 文件,其中包含以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
我可以看到三个可能的选项:
我的建议是使用简单明了的方法 1。
您可能还想查看用于类似目的的JAXBIntroductions项目。注释配置保存在文件中,无需修改源代码。通过实现 JAX-RS 提供程序,它确实与 Jersey 很好地工作。您可以查看我的博客文章,其中通过示例详细说明了这一点。这是一个简单的 JAXBContextResolver 为 JAXBIntroductions 提供,可以在您的 Jersey 应用程序中使用。
import com.sun.xml.bind.api.JAXBRIContext;
import org.jboss.jaxb.intros.IntroductionsAnnotationReader;
import org.jboss.jaxb.intros.IntroductionsConfigParser;
import org.jboss.jaxb.intros.configmodel.JaxbIntros;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBContext;
import java.util.*;
@Provider
public class JAXBContextResolverForJAXBIntroductions implements ContextResolver<JAXBContext> {
private final JAXBContext context;
private final Set<Class> types;
private final Class[] cTypes = {Customer.class};
public JAXBContextResolverForJAXBIntroductions() throws Exception {
this.types = new HashSet(Arrays.asList(cTypes));
JaxbIntros config = IntroductionsConfigParser.parseConfig(this.getClass().getResourceAsStream("/intro-config.xml"));
IntroductionsAnnotationReader reader = new IntroductionsAnnotationReader(config);
Map<String, Object> jaxbConfig = new HashMap<String, Object>();
jaxbConfig.put(JAXBRIContext.ANNOTATION_READER, reader);
this.context = JAXBContext.newInstance(cTypes, jaxbConfig);
}
public JAXBContext getContext(Class<?> objectType) {
return (types.contains(objectType)) ? context : null;
}
}