[英]Performing a JNDI lookup in a JAXB XmlAdapter
我的项目是Java Enterprise项目,包含三个模块:
我的域模型驻留在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>
通过编写专用的XmlAdapter
, ModelAdapter
并使用@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.