Java 如何在Mule中使用XStream?
我已经编写了三个实现XStream的类。 它封送/解封下列XMLJava 如何在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=
<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"/>