3

我正在尝试为Jerseyjavax.xml.bind.annotation.adapters.XmlAdapter中的类型配置“系统范围”自定义。java.util.Locale在我控制的类上使用它很容易,@XmlJavaTypeAdapter但情况并非总是如此(我无法注释的第 3 方代码)。

这似乎是一个很常见的问题,但我找不到任何好的例子或文档来说明如何处理它。

那么,有可能吗?

谢谢!

4

3 回答 3

1

如果您需要对无法修改的类进行注释,则始终可以使用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
于 2010-07-12T17:45:35.180 回答
1

我可以看到三个可能的选项:

  1. 使用setAdapter()向编组器注册转换器。您可以拥有一个静态构建器函数,它将所有“系统级”类型适配器添加到您在应用程序中使用的所有编组器。这完全取决于您对“系统级别”的定义
  2. 使用委托
  3. 做一些花哨的字节码技巧来将注释添加到现有的类文件中。

我的建议是使用简单明了的方法 1。

于 2010-07-10T09:57:55.033 回答
0

您可能还想查看用于类似目的的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;
    }
}
于 2011-06-12T23:52:37.800 回答