泽西的系统范围适配器?

时间:2010-07-10 03:09:34

标签: java rest jaxb jersey jax-rs

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

这似乎是一个非常常见的问题,但我找不到任何好的例子或doco如何处理它。

那么,有可能吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

我可以看到三种可能的选择:

  1. 使用setAdapter()向编组器注册转换器。您可以使用静态构建器功能,将所有“系统级”类型适配器添加到您在应用程序中使用的所有编组器。这完全取决于您对“系统级别”的定义
  2. 使用代理
  3. 做一些花哨的bytecode trickery来为现有的类文件添加注释。
  4. 我的建议是使用方法1,这很简单直接。

答案 1 :(得分:1)

如果您需要注释无法修改的课程,则可以始终使用externalized metadata featureEclipseLink 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;
    }
}