Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Mule中使用XStream?_Java_Xml_Xml Serialization_Mule - Fatal编程技术网

Java 如何在Mule中使用XStream?

Java 如何在Mule中使用XStream?,java,xml,xml-serialization,mule,Java,Xml,Xml Serialization,Mule,我已经编写了三个实现XStream的类。 它封送/解封下列XML <Message calledProgram="XXX" programName="YYY"> <Fields> <Field name="SupplierName" value="ABC"/> <Field name="SupplierNo" value="123456"/> <Field name="SupplierCountry" value=

我已经编写了三个实现XStream的类。 它封送/解封下列XML

<Message calledProgram="XXX" programName="YYY">
  <Fields>
    <Field name="SupplierName" value="ABC"/>
    <Field name="SupplierNo" value="123456"/>
    <Field name="SupplierCountry" value="AA"/>
    <Field name="TermsOfDelivery" value="5"/>
    <Field name="PaymentTerms" value="90"/>
    <Field name="Currency" value="GBP"/>
  </Fields>
</Message>
更新:

虽然这不是我真正的代码。但你说的OOTB是什么意思?这也不行。也尝试过不使用File-2-String

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:mulexml="http://www.mulesoft.org/schema/mule/xml" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="CE-3.3.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/xml         http://www.mulesoft.org/schema/mule/xml/current/mule-xml.xsd 
http://www.mulesoft.org/schema/mule/file     http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core   http://www.mulesoft.org/schema/mule/core/current/mule.xsd ">
    <flow name="MyXStreamFlow1" doc:name="MyXStreamFlow1">
    <file:inbound-endpoint path="E:\JavaDev\Test" responseTimeout="10000" doc:name="File"/>
    <logger level="INFO" doc:name="Logger"/>
    <file:file-to-string-transformer doc:name="File to String"/>
    <logger message="WTF" level="INFO" doc:name="Logger"/>
    <mulexml:xml-to-object-transformer doc:name="XML to Object"/>
    <logger level="INFO" doc:name="Logger"/>
    <mulexml:object-to-xml-transformer doc:name="Object to XML"/>
    <logger level="INFO" doc:name="Logger"/>
</flow>
-

封装测试;
导入java.util.array;
导入java.util.List;
导入com.thoughtworks.xstream.annotations.XStreamImplicit;
公共类字段{
@XStreamImplicit(itemFieldName=“Field”)
私有列表字段;
公共字段(字段…字段){
this.fields=Arrays.asList(字段);
}
/**
*@返回字段
*/
公共列表getFields(){
返回字段;
}
/**
*@param字段
*要设置的字段
*/
公共无效设置字段(列表字段){
this.fields=字段;
}
}
如何在Mule中使用XStream?

转换器在内部使用XStream,因此它应该在OOTB中工作


请提供流配置,我将相应地更新我的答案。

我无法配置
xml-to-object-transformer
,因此它可以与您的XStream注释类一起工作。我能够加载上面的XML示例并成功完成流程的唯一方法是使用Spring实例化和配置XStream,如下所示:

<spring:beans>
    <spring:bean name="xStream" class="com.thoughtworks.xstream.XStream" />
    <spring:bean
        class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
        p:targetObject-ref="xStream"
        p:targetMethod="processAnnotations">
        <spring:property name="arguments">
            <spring:list>
                <spring:value>test.GenericClass</spring:value>
            </spring:list>
        </spring:property>
    </spring:bean>
</spring:beans>
我意识到这不是非常好,所以希望其他人会有更好的解决方案。

问题 默认的XML对象转换器只支持类的别名注释:

<mulexml:object-to-xml-transformer doc:name="Object to XML">
    <mulexml:alias name="myAlias" class="com.my.package.MyClass"/>
</mulexml:object-to-xml-transformer>
2.在Mule流中使用自定义转换器 向流中添加Java Transformer(非Java组件):

<custom-transformer class="com.my.package.ObjectToXml" doc:name="Object to XML"/>


就这样

您是否将这些类与Mule应用程序一起部署?您好,David,我正在尝试在Mule流中使用我的类。但我不知道如何“使用”它们。我是个新手。我通过JMS接收到一个XML,我想用XStream将其转换为一个对象。顺便说一句,刚买了第二版的MEAP for Mule in Action。你的类在Mule项目的类路径上吗?我在他那个时候没有可用的代码。课程在我的Mule项目中。如何确保它们在我的类路径上?为什么上面的OOTB不能像genjosanzo暗示的那样工作?当转换成一个对象时,我实际上想再次转换成另一个对象。将我的值从我的新对象移动到将创建旧平面文件的对象。它应该可以工作。您还可以共享JAva类吗?这样我们可以尝试重现问题。请参阅更新。它怎么能只用OOTB呢?以上也不只是工作。新的更新。如何将带注释的XStream插件到Mle流中?嗨,David。在这里一点运气都没有。我在bean中遇到问题:属性targetObject ref未定义为bean的有效属性。同样适用于p:targetMethod。我已经把豆子配置好了。你能发送包括xml配置在内的整个流程吗。谢谢。我如何将xml字符串发送到我的XStream类,而不是对对象执行xml操作?我可以称之为POJO吗。你能给我指一个很好的网页,举一个叫POJO的例子吗?然后我想将Xstream对象值复制到另一个POJO。然后,这个POJO将输出一个平面文件。然后将该字符串放入JMS队列中。我已将
bean
绑定到标准Spring命名空间
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
p
绑定到标准Spring p命名空间
xmlns:p=”http://www.springframework.org/schema/p"
。我给你的答案就是:“给我的XStream类发送一个XML字符串”,这样我就不会收到你的第二条评论。我能看到的唯一替代方法是,因为最终结果是一个平面文件,所以使用XSL-T将源XML直接转换为TXT。在这种情况下不需要对象反序列化/序列化。嗨,David。很抱歉,我一直对p-namespace有问题。p:targetMethod=“processAnnotations”给出“属性targetMethod未定义为bean的有效属性”,即使我添加了
xmlns:p=”http://www.springframework.org/schema/p“
。你能给我看看你的mule配置文件吗?谢谢。我没有代码来尝试它,因为我已经转移到其他项目。但似乎是合理的/Ziggy@ZiggyStardust也许其他人会发现这很有用!
package test;

import java.util.Arrays;
import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamImplicit;



public class Fields {

@XStreamImplicit(itemFieldName = "Field")
private List<Field> fields;

public Fields(Field... field) {
    this.fields = Arrays.asList(field);
}

/**
 * @return the fields
 */
public List<Field> getFields() {
    return fields;
}

/**
 * @param fields
 *            the fields to set
 */
public void setFields(List<Field> fields) {
    this.fields = fields;
}

}
<spring:beans>
    <spring:bean name="xStream" class="com.thoughtworks.xstream.XStream" />
    <spring:bean
        class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
        p:targetObject-ref="xStream"
        p:targetMethod="processAnnotations">
        <spring:property name="arguments">
            <spring:list>
                <spring:value>test.GenericClass</spring:value>
            </spring:list>
        </spring:property>
    </spring:bean>
</spring:beans>
<expression-transformer
    expression="#[app.registry.xStream.fromXML(message.payload)]" />
<mulexml:object-to-xml-transformer doc:name="Object to XML">
    <mulexml:alias name="myAlias" class="com.my.package.MyClass"/>
</mulexml:object-to-xml-transformer>
public class ObjectToXml extends AbstractMessageTransformer {

  public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException {

    XStream xstream = new XStream();

    // The payload should be the object to transform into XML
    Object object = message.getPayload();

    // Register all annotations in the XStream instance 
    xstream.processAnnotations(object.getClass());

    // Convert the object to XML and set it as payload
    message.setPayload(xstream.toXML(object));

    return message;
  }
}
<custom-transformer class="com.my.package.ObjectToXml" doc:name="Object to XML"/>