如何设置自定义JAXBContext

时间:2012-06-20 14:23:31

标签: java jaxb annotations jax-ws java-metro-framework

我想在jax-ws中提出一个关于 @UsesJAXBContext 注释的问题。我试图让它在客户端工作,但我可能会遗漏一些东西。这是我的情况:

我的网络服务有操作:

@WebMethod(operationName = "putToQueue")
public boolean put(@WebParam(name = "queueName") String queueName, @WebParam(name = "element") Object element) {
    return queues.get(queueName).offer(element);
}

在客户端,我生成了QueueService和Queue(端口)...以及其他东西... [响应请求。在这种情况下无关紧要。] 我想让用户定义他/她可以排队的对象。但是要调用操作 put(...)我需要绑定对象(我尝试发送)到JAXBContext中。我可以做到这一点 @XmlSeeAlso 在生成的队列存根的顶部[我试过这个并且它可以工作]。尽管如此,我需要更通用的解决方案来帮助我在运行时绑定对象。 我认为我可以创建 @QueueMessage 注释和 ClientJAXBContextFactory ,并在创建时将标记的类添加到上下文中。

public class ClientJAXBContextFactory implements JAXBContextFactory {

    @Override
    public JAXBRIContext createJAXBContext(SEIModel seim, List<Class> classes, List<TypeReference> references) throws JAXBException {
        Reflections reflections = new Reflections("");
        Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(QueueMessage.class);
        classes.addAll(annotated);

        return JAXBContextFactory.DEFAULT.createJAXBContext(seim, classes, references);
    }
}

接下来我尝试在生成的队列之上使用 @UsesJAXBContext

@WebService(name = "Queue")
@UsesJAXBContext(ClientJAXBContextFactory.class)
public interface Queue {
...
}

但是 createJAXBContext(...)没有被调用,而jax-ws只是简单地创建了他的JAXBContextImpl。

我读过:

http://weblogs.java.net/blog/jitu/archive/2008/08/control_of_jaxb.html

http://www.techques.com/question/1-5627173/Specify-JAXB-Packages-in-SLSB-and-JAX-WS

和stackOverFlow上的一些问题。我很感激你的建议。 是否有可能实现我的问题中提出的想法?

我也可以在服务器端添加... @UsesJAXBContext 有效。但对我来说,让它在客户端工作非常重要。

1 个答案:

答案 0 :(得分:5)

好的,我可以解决我面临的问题。我仍然无法使用 @UsesJAXBContext 与客户端使用Web服务。但是我发现这个注释与具有修复后功能的bean相关联。所以有一个类 UsesJAXBContextFeature

https://jax-ws.java.net/nonav/2.2.7/javadocs/com/sun/xml/ws/developer/UsesJAXBContextFeature.html

它可以作为端口或服务的参数传递(自jax-ws 2.2以来的服务)。我对版本有点麻烦所以我决定生成类并使用jax-ws 2.1。现在我只是简单地创建这样的端口:

new QueueService().getQueuePort(new UsesJAXBContextFeature(new ClientJAXBContextFactory()));

它有效!