Mule问题:不止一个JAXBContext

Mule问题:不止一个JAXBContext,jaxb,mule,Jaxb,Mule,我们在Mule适配器中面临一个与JAXB上下文相关的问题,我们需要对这个问题发表一些意见 我们正在使用xpath计算适配器中选择块中的一些表达式,例如 <choice doc:name="Choice"> <when expression="//env:abc/env:Body/ref:dataelement/ref:/ref:element" evaluator="xpath"> ...... </when> 在记录器等的帮助下进行调试后,

我们在Mule适配器中面临一个与JAXB上下文相关的问题,我们需要对这个问题发表一些意见 我们正在使用xpath计算适配器中选择块中的一些表达式,例如

<choice doc:name="Choice">
<when expression="//env:abc/env:Body/ref:dataelement/ref:/ref:element" evaluator="xpath">
        ......
</when>
在记录器等的帮助下进行调试后,我们缩小到上面使用的选项块,它导致了这个特殊问题。此外,谷歌搜索了一下,发现其中一篇帖子指出了同样的问题

另外,为了确认,我们注释掉了包含xpath表达式的choice块,流程继续进行,但在以其他方式使用xpath的地方再次中断


有谁能提出解决这个问题的合适方法吗?

我同意你的看法。这是Mule中尚未解决的问题

我们已经实现的一个解决方案是在jar文件中提供的配置中不定义jaxb上下文

与jar文件一起,向使用jar文件的最终应用程序发出指示,以便在JAXB上下文对象定义中包含JAXB包

这样,只有一个JAXB上下文,它将顺利工作


希望这能有所帮助。

虽然这有点晚,但解决方案还是有效的

<mulexml:jaxb-context name=“JAXB_Context“ packageNames=“org.example.test1:org.example.test2“ doc:name=“JAXB Context1“ />

请注意,包名称之间不能有空格


感谢:

到目前为止,我们无法在mule中添加多个JAXBContext。作为替代方案,您可以编写自定义转换器

我实现了类似于

public interface MyAppJaxbObj2XmlComponent<I,O> extends 
MyAppComponent<I,O>,Callable {  
  public O marshal(I input) throws Exception;
}
公共接口MyAppJaxbObj2XmlComponent扩展
MyAppComponent,可调用{
公共O封送(I输入)抛出异常;
}
抽真空变压器

public abstract class AbstractMyAppJaxbObj2XmlComponent<I,O> implements 
 MyAppJaxbObj2XmlComponent<I,O>{
  private Class<I> inputType;   
    public AbstractMyAppJaxbObj2XmlComponent(){
    this.inputType = (Class<I>) new TypeToken<I>(getClass()) 
 {}.getRawType();
 }

 public AbstractMyAppJaxbObj2XmlComponent(Class<I> type){
    this.inputType = type;
 }

@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
    I input = eventContext.getMessage().getPayload(inputType);
    O output = marshal(input);
    return output;
 }
}
公共抽象类AbstractMyAppJaxbObj2XmlComponent实现
MyAppJaxbObj2XmlComponent{
私有类输入类型;
公共抽象MyAppjaxBobj2xMLComponent(){
this.inputType=(类)新类型令牌(getClass())
{}.getRawType();
}
公共抽象MyAppjaxBobj2xMLComponent(类类型){
this.inputType=类型;
}
@凌驾
公共对象onCall(MuleEventContext eventContext)引发异常{
I输入=eventContext.getMessage().getPayload(inputType);
O输出=封送(输入);
返回输出;
}
}
您的流转换器将在启动期间加载所需的jaxb

@Component
public class MyFlowJaxbObj2XmlComponent extends 
AbstractMyAppJaxbObj2XmlComponent<RequestPayloadType,String> {
@PostConstruct
 public void init() {
  //Load your schema during startup
 }
}
@组件
公共类MyFlowJaxbObj2XmlComponent扩展
AbstractMyAppJaxbObj2XmlComponent{
@施工后
公共void init(){
//在启动期间加载模式
}
}

您还可以实现一个流体接口作为替代。

我不确定我是否理解这一点,因为我们还没有在配置文件中定义任何jaxb上下文。我们正在使用XMLDOM,反之亦然,但是我们没有提供任何JAXB上下文。如果你能指出我在哪里可以了解更多细节,那会很有帮助的。谢谢。
@Component
public class MyFlowJaxbObj2XmlComponent extends 
AbstractMyAppJaxbObj2XmlComponent<RequestPayloadType,String> {
@PostConstruct
 public void init() {
  //Load your schema during startup
 }
}