我正在尝试为Jersey中的javax.xml.bind.annotation.adapters.XmlAdapter
类型配置“系统范围”自定义java.util.Locale
。在我控制的类上使用@XmlJavaTypeAdapter
很容易,但情况并非总是如此(我无法注释的第三方代码)。
这似乎是一个非常常见的问题,但我找不到任何好的例子或doco如何处理它。
那么,有可能吗?
谢谢!
答案 0 :(得分:1)
我可以看到三种可能的选择:
我的建议是使用方法1,这很简单直接。
答案 1 :(得分:1)
如果您需要注释无法修改的课程,则可以始终使用externalized metadata feature的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
答案 2 :(得分:0)
您可能还想查看旨在用于类似目的的JAXBIntroductions项目。注释配置保存在文件中,无需修改源代码。通过实现JAX-RS提供程序,它可以很好地与Jersey配合使用。您可以查看我的博客entry,其中通过示例详细说明了这一点。这是一个简单的JAXBContextResolver,可以在Jersey应用程序中使用JAXBIntroductions。
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;
}
}