繁体   English   中英

在JAXB XmlAdapter中执行JNDI查找

[英]Performing a JNDI lookup in a JAXB XmlAdapter

我的项目是Java Enterprise项目,包含三个模块:

  • 装配(EAR)
    • EJB(JAR)
    • 网络(WAR)

我的域模型驻留在EJB中。 这包括Manufacturer类和Model类。 两者之间存在一对多的关系。 我通过驻留在我的Web项目中的REST接口公开这些制造商和模型的实例。

每当我访问其中一个制造商时,都会生成以下XML代码:

<manufacturer id=1>
    <name>Ford</name>
    <models>
        <model id=1>
            <name>Fiesta</name>
        </model>
        <model id=2>
            <name>Focus</name>
        </model>
    </models>
</manufacturer>

但是,我希望它是这样的:

<manufacturer id=1>
    <name>Ford</name>
    <models>
        <model>1</model>
        <model>2</model>
    </models>
</manufacturer>

通过编写专用的XmlAdapterModelAdapter并使用@XmlJavaTypeAdapter(ModelAdapter.class)Manufacturer类中注释该字段,我已经达到了预期的效果。 此适配器也驻留在我的EJB模块中。 但是,当Model需要解组时会出现问题:

private ModelFacade modelFacade;

@Override
public Model unmarshal(Long id) throws Exception {
    return modelFacade.find(id);
}

ModelFacade是一个无状态会话bean,无法注入XmlAdapter ,因此解组过程将始终失败。

我被建议编写一个MessageBodyReader ,以便能够“手动”实例化适配器并将外观作为参数传递,但是这个专门的消息体阅读器需要在Web模块中实现。 我非常想在EJB模块中包含这种行为,原因很简单,如果我决定创建一个依赖于EJB的桌面应用程序,我不需要再次处理同样的问题。

为了实现这种行为,我可以在适配器的构造函数中执行JNDI查找:

public AbstractAdapter(String name) throws NamingException {
    facade = (AbstractFacade<B>) lookup("java:app/MyEJB/" + name);
}

private Object lookup(String name) throws NamingException {
    Context c = new InitialContext();
    return c.lookup(name);
}

这将完美无缺,但我不确定这是正确的方法。 从EJB模块进行JNDI查找是一个非常好的解决方案还是更有利的?

您可以在JAX-RS方法(在会话bean上)上指定java.io.InputStream类型的参数。 然后你可以解组那个利用JAXB的InputStream 这将使您有机会使用适当的XmlAdapter配置javax.xml.bind.Unmarshaller

欲获得更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM