XStream中使用annotation处理attribute

本文介绍了如何使用XStream的@XStreamAsAttribute注解来处理XML文件中的attributes,并提供了具体的JavaBean示例代码,展示了从Java对象到XML的转换过程。

原先以为XStream不支持attribute。最近发现v1.3以后是支持的,使用annotation来定义,而且因为一直在用XStream,就不改成jaxb2.1了。

 

看见网上介绍得不多,贴一下源码,以供参考。

javabean的attribute使用@XStreamAsAttribute来定义,

同时需要调用 XStream.processAnnotations(YourClass.class);

 

XML文件如下:

 

<?xml version="1.0" encoding="UTF-8"?>
	<!-- 接口定义-->
<interfaceDefine>
	<osUDPairCollectReq>
		<version>1.0.0</version>
		<providerSID>00600001</providerSID>
		<providerEID>0005</providerEID>
		<providerECID>0005.01</providerECID>
		<providerIFName>osUDPairCollect</providerIFName>
		<callingType>01</callingType>
	</osUDPairCollectReq>
	<!—测试使用attribute -->
	<deviceCaps>
		<services>
			<service name="BMS">
				<items>
					<item id="160" yes="YES" no="NO" />
				</items>
			</service>
		</services>
	</deviceCaps>
</interfaceDefine>

 JavaBean如下:

 

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;

@XStreamAlias("interfaceDefine")
public class InterfaceDefine {
	/**
	 *测试的子类
	 */
	public static class OsRequestHeader {
		public String version, providerSID, providerEID, providerECID,
				providerIFName, callingType;
	}

	public static class DeviceCaps {
		public Service[] services;

		@XStreamAlias("service")
		public static class Service {
			@XStreamAsAttribute
			public String name;
			public Set<Item> items;
		}

		@XStreamAlias("item")
		public static class Item {
			@XStreamAsAttribute
			public Integer id;
			@XStreamAsAttribute
			public String yes = "YES";
			@XStreamAsAttribute
			public String no = "NO";
		}
	}

	/**
	 * 操作接口
	 */
	public OsRequestHeader osUDPairCollectReq;

	 

	public DeviceCaps deviceCaps;


        /*
        * 将对象转换成XML的实现
        */
	@Override
	public String toString() {
		XStream xs = new XStream();
		xs.processAnnotations(InterfaceDefine.class);
		return xs.toXML(this);
	}
}
E:\soft\jdk_17.0.11\bin\java.exe -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" -javaagent:E:\soft\idea_2024.2.1_zh\lib\idea_rt.jar=59662:E:\soft\idea_2024.2.1_zh\bin -Dfile.encoding=UTF-8 -classpath E:\AAAaGraduationProjectSharedKitchen\BackendCode\SharedKitchen\target\classes;E:\soft\maven_3.8.1\pro\org\springframework\boot\spring-boot-starter-web\3.2.0\spring-boot-starter-web-3.2.0.jar;E:\soft\maven_3.8.1\pro\org\springframework\boot\spring-boot-starter\3.2.0\spring-boot-starter-3.2.0.jar;E:\soft\maven_3.8.1\pro\org\springframework\boot\spring-boot\3.2.0\spring-boot-3.2.0.jar;E:\soft\maven_3.8.1\pro\org\springframework\boot\spring-boot-starter-logging\3.2.0\spring-boot-starter-logging-3.2.0.jar;E:\soft\maven_3.8.1\pro\ch\qos\logback\logback-classic\1.4.11\logback-classic-1.4.11.jar;E:\soft\maven_3.8.1\pro\ch\qos\logback\logback-core\1.4.11\logback-core-1.4.11.jar;E:\soft\maven_3.8.1\pro\org\apache\logging\log4j\log4j-to-slf4j\2.21.1\log4j-to-slf4j-2.21.1.jar;E:\soft\maven_3.8.1\pro\org\apache\logging\log4j\log4j-api\2.21.1\log4j-api-2.21.1.jar;E:\soft\maven_3.8.1\pro\org\slf4j\jul-to-slf4j\2.0.9\jul-to-slf4j-2.0.9.jar;E:\soft\maven_3.8.1\pro\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;E:\soft\maven_3.8.1\pro\org\yaml\snakeyaml\2.2\snakeyaml-2.2.jar;E:\soft\maven_3.8.1\pro\org\springframework\boot\spring-boot-starter-json\3.2.0\spring-boot-starter-json-3.2.0.jar;E:\soft\maven_3.8.1\pro\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.15.3\jackson-datatype-jdk8-2.15.3.jar;E:\soft\maven_3.8.1\pro\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.15.3\jackson-datatype-jsr310-2.15.3.jar;E:\soft\maven_3.8.1\pro\com\fasterxml\jackson\module\jackson-module-parameter-names\2.15.3\jackson-module-parameter-names-2.15.3.jar;E:\soft\maven_3.8.1\pro\org\springframework\boot\spring-boot-starter-tomcat\3.2.0\spring-boot-starter-tomcat-3.2.0.jar;E:\soft\maven_3.8.1\pro\org\apache\tomcat\embed\tomcat-embed-core\10.1.16\tomcat-embed-core-10.1.16.jar;E:\soft\maven_3.8.1\pro\org\apache\tomcat\embed\tomcat-embed-el\10.1.16\tomcat-embed-el-10.1.16.jar;E:\soft\maven_3.8.1\pro\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.16\tomcat-embed-websocket-10.1.16.jar;E:\soft\maven_3.8.1\pro\org\springframework\spring-web\6.1.1\spring-web-6.1.1.jar;E:\soft\maven_3.8.1\pro\org\springframework\spring-beans\6.1.1\spring-beans-6.1.1.jar;E:\soft\maven_3.8.1\pro\io\micrometer\micrometer-observation\1.12.0\micrometer-observation-1.12.0.jar;E:\soft\maven_3.8.1\pro\io\micrometer\micrometer-commons\1.12.0\micrometer-commons-1.12.0.jar;E:\soft\maven_3.8.1\pro\org\springframework\spring-webmvc\6.1.1\spring-webmvc-6.1.1.jar;E:\soft\maven_3.8.1\pro\org\springframework\spring-aop\6.1.1\spring-aop-6.1.1.jar;E:\soft\maven_3.8.1\pro\org\springframework\spring-context\6.1.1\spring-context-6.1.1.jar;E:\soft\maven_3.8.1\pro\org\springframework\spring-expression\6.1.1\spring-expression-6.1.1.jar;E:\soft\maven_3.8.1\pro\com\baomidou\mybatis-plus-boot-starter\3.5.7\mybatis-plus-boot-starter-3.5.7.jar;E:\soft\maven_3.8.1\pro\com\baomidou\mybatis-plus\3.5.7\mybatis-plus-3.5.7.jar;E:\soft\maven_3.8.1\pro\com\baomidou\mybatis-plus-core\3.5.7\mybatis-plus-core-3.5.7.jar;E:\soft\maven_3.8.1\pro\com\baomidou\mybatis-plus-annotation\3.5.7\mybatis-plus-annotation-3.5.7.jar;E:\soft\maven_3.8.1\pro\com\baomidou\mybatis-plus-extension\3.5.7\mybatis-plus-extension-3.5.7.jar;E:\soft\maven_3.8.1\pro\org\mybatis\mybatis\3.5.16\mybatis-3.5.16.jar;E:\soft\maven_3.8.1\pro\com\github\jsqlparser\jsqlparser\4.9\jsqlparser-4.9.jar;E:\soft\maven_3.8.1\pro\org\mybatis\mybatis-spring\2.1.2\mybatis-spring-2.1.2.jar;E:\soft\maven_3.8.1\pro\com\baomidou\mybatis-plus-spring-boot-autoconfigure\3.5.7\mybatis-plus-spring-boot-autoconfigure-3.5.7.jar;E:\soft\maven_3.8.1\pro\org\springframework\boot\spring-boot-autoconfigure\3.2.0\spring-boot-autoconfigure-3.2.0.jar;E:\soft\maven_3.8.1\pro\org\springframework\boot\spring-boot-starter-jdbc\3.2.0\spring-boot-starter-jdbc-3.2.0.jar;E:\soft\maven_3.8.1\pro\com\zaxxer\HikariCP\5.0.1\HikariCP-5.0.1.jar;E:\soft\maven_3.8.1\pro\org\springframework\spring-jdbc\6.1.1\spring-jdbc-6.1.1.jar;E:\soft\maven_3.8.1\pro\com\mysql\mysql-connector-j\8.0.33\mysql-connector-j-8.0.33.jar;E:\soft\maven_3.8.1\pro\org\springframework\boot\spring-boot-starter-data-redis\3.2.0\spring-boot-starter-data-redis-3.2.0.jar;E:\soft\maven_3.8.1\pro\io\lettuce\lettuce-core\6.3.0.RELEASE\lettuce-core-6.3.0.RELEASE.jar;E:\soft\maven_3.8.1\pro\io\netty\netty-common\4.1.101.Final\netty-common-4.1.101.Final.jar;E:\soft\maven_3.8.1\pro\io\netty\netty-handler\4.1.101.Final\netty-handler-4.1.101.Final.jar;E:\soft\maven_3.8.1\pro\io\netty\netty-resolver\4.1.101.Final\netty-resolver-4.1.101.Final.jar;E:\soft\maven_3.8.1\pro\io\netty\netty-buffer\4.1.101.Final\netty-buffer-4.1.101.Final.jar;E:\soft\maven_3.8.1\pro\io\netty\netty-transport-native-unix-common\4.1.101.Final\netty-transport-native-unix-common-4.1.101.Final.jar;E:\soft\maven_3.8.1\pro\io\netty\netty-codec\4.1.101.Final\netty-codec-4.1.101.Final.jar;E:\soft\maven_3.8.1\pro\io\netty\netty-transport\4.1.101.Final\netty-transport-4.1.101.Final.jar;E:\soft\maven_3.8.1\pro\io\projectreactor\reactor-core\3.6.0\reactor-core-3.6.0.jar;E:\soft\maven_3.8.1\pro\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar;E:\soft\maven_3.8.1\pro\org\springframework\data\spring-data-redis\3.2.0\spring-data-redis-3.2.0.jar;E:\soft\maven_3.8.1\pro\org\springframework\data\spring-data-keyvalue\3.2.0\spring-data-keyvalue-3.2.0.jar;E:\soft\maven_3.8.1\pro\org\springframework\data\spring-data-commons\3.2.0\spring-data-commons-3.2.0.jar;E:\soft\maven_3.8.1\pro\org\springframework\spring-tx\6.1.1\spring-tx-6.1.1.jar;E:\soft\maven_3.8.1\pro\org\springframework\spring-oxm\6.1.1\spring-oxm-6.1.1.jar;E:\soft\maven_3.8.1\pro\org\springframework\spring-context-support\6.1.1\spring-context-support-6.1.1.jar;E:\soft\maven_3.8.1\pro\org\slf4j\slf4j-api\2.0.9\slf4j-api-2.0.9.jar;E:\soft\maven_3.8.1\pro\com\github\binarywang\wx-java-miniapp-spring-boot-starter\4.6.0\wx-java-miniapp-spring-boot-starter-4.6.0.jar;E:\soft\maven_3.8.1\pro\com\github\binarywang\weixin-java-miniapp\4.6.0\weixin-java-miniapp-4.6.0.jar;E:\soft\maven_3.8.1\pro\com\github\binarywang\weixin-java-common\4.6.0\weixin-java-common-4.6.0.jar;E:\soft\maven_3.8.1\pro\com\thoughtworks\xstream\xstream\1.4.20\xstream-1.4.20.jar;E:\soft\maven_3.8.1\pro\io\github\x-stream\mxparser\1.2.2\mxparser-1.2.2.jar;E:\soft\maven_3.8.1\pro\xmlpull\xmlpull\1.1.3.1\xmlpull-1.1.3.1.jar;E:\soft\maven_3.8.1\pro\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;E:\soft\maven_3.8.1\pro\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;E:\soft\maven_3.8.1\pro\org\apache\httpcomponents\httpmime\4.5.13\httpmime-4.5.13.jar;E:\soft\maven_3.8.1\pro\org\slf4j\jcl-over-slf4j\2.0.9\jcl-over-slf4j-2.0.9.jar;E:\soft\maven_3.8.1\pro\com\google\code\gson\gson\2.10.1\gson-2.10.1.jar;E:\soft\maven_3.8.1\pro\commons-codec\commons-codec\1.16.0\commons-codec-1.16.0.jar;E:\soft\maven_3.8.1\pro\commons-io\commons-io\2.7\commons-io-2.7.jar;E:\soft\maven_3.8.1\pro\org\apache\commons\commons-lang3\3.13.0\commons-lang3-3.13.0.jar;E:\soft\maven_3.8.1\pro\com\google\guava\guava\32.1.2-jre\guava-32.1.2-jre.jar;E:\soft\maven_3.8.1\pro\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;E:\soft\maven_3.8.1\pro\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;E:\soft\maven_3.8.1\pro\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;E:\soft\maven_3.8.1\pro\org\checkerframework\checker-qual\3.33.0\checker-qual-3.33.0.jar;E:\soft\maven_3.8.1\pro\com\google\errorprone\error_prone_annotations\2.18.0\error_prone_annotations-2.18.0.jar;E:\soft\maven_3.8.1\pro\com\google\j2objc\j2objc-annotations\2.8\j2objc-annotations-2.8.jar;E:\soft\maven_3.8.1\pro\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;E:\soft\maven_3.8.1\pro\org\bouncycastle\bcpkix-jdk15on\1.70\bcpkix-jdk15on-1.70.jar;E:\soft\maven_3.8.1\pro\org\bouncycastle\bcprov-jdk15on\1.70\bcprov-jdk15on-1.70.jar;E:\soft\maven_3.8.1\pro\org\bouncycastle\bcutil-jdk15on\1.70\bcutil-jdk15on-1.70.jar;E:\soft\maven_3.8.1\pro\io\jsonwebtoken\jjwt\0.9.1\jjwt-0.9.1.jar;E:\soft\maven_3.8.1\pro\com\fasterxml\jackson\core\jackson-databind\2.15.3\jackson-databind-2.15.3.jar;E:\soft\maven_3.8.1\pro\com\fasterxml\jackson\core\jackson-annotations\2.15.3\jackson-annotations-2.15.3.jar;E:\soft\maven_3.8.1\pro\com\fasterxml\jackson\core\jackson-core\2.15.3\jackson-core-2.15.3.jar;E:\soft\maven_3.8.1\pro\cn\hutool\hutool-all\5.8.21\hutool-all-5.8.21.jar;E:\soft\maven_3.8.1\pro\org\projectlombok\lombok\1.18.30\lombok-1.18.30.jar;E:\soft\maven_3.8.1\pro\org\springframework\spring-core\6.1.1\spring-core-6.1.1.jar;E:\soft\maven_3.8.1\pro\org\springframework\spring-jcl\6.1.1\spring-jcl-6.1.1.jar;E:\soft\maven_3.8.1\pro\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar Gp.Kcw.ShareKitchen.ShareKitchenApplication . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.2.0) 2025-08-27T17:13:22.726+08:00 INFO 36616 --- [ main] G.K.S.ShareKitchenApplication : Starting ShareKitchenApplication using Java 17.0.11 with PID 36616 (E:\AAAaGraduationProjectSharedKitchen\BackendCode\SharedKitchen\target\classes started by KouChengWei in E:\AAAaGraduationProjectSharedKitchen\BackendCode\SharedKitchen) 2025-08-27T17:13:22.731+08:00 INFO 36616 --- [ main] G.K.S.ShareKitchenApplication : No active profile set, falling back to 1 default profile: "default" 2025-08-27T17:13:24.147+08:00 INFO 36616 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode 2025-08-27T17:13:24.151+08:00 INFO 36616 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. 2025-08-27T17:13:24.204+08:00 INFO 36616 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 25 ms. Found 0 Redis repository interfaces. 2025-08-27T17:13:24.439+08:00 WARN 36616 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: java.lang.IllegalArgumentException: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String 2025-08-27T17:13:24.459+08:00 INFO 36616 --- [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2025-08-27T17:13:24.490+08:00 ERROR 36616 --- [ main] o.s.boot.SpringApplication : Application run failed java.lang.IllegalArgumentException: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getTypeForFactoryBeanFromAttributes(FactoryBeanRegistrySupport.java:86) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:838) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:620) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:573) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:532) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:138) ~[spring-context-6.1.1.jar:6.1.1] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:775) ~[spring-context-6.1.1.jar:6.1.1] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:597) ~[spring-context-6.1.1.jar:6.1.1] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.0.jar:3.2.0] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753) ~[spring-boot-3.2.0.jar:3.2.0] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455) ~[spring-boot-3.2.0.jar:3.2.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:323) ~[spring-boot-3.2.0.jar:3.2.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1342) ~[spring-boot-3.2.0.jar:3.2.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1331) ~[spring-boot-3.2.0.jar:3.2.0] at Gp.Kcw.ShareKitchen.ShareKitchenApplication.main(ShareKitchenApplication.java:11) ~[classes/:na] Process finished with exit code 1
最新发布
08-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值