`

WebService CXF JAXB角色及简单使用

 
阅读更多

WebService传递XML文档,当然也可以传递JSON对象。这节我只针对传递XML,那么JAVA绑定成XML,服务端将XML解析成Java对象有什么工具可用吗,其实这样的工具多的是。这里我选择一个比较简单的JAXB工具来讲解一下。 
    JAXB(Java Architecture for XML Binding)提供了一个快速而方便的方式绑定XML Schemas和java,使java程序员能够很方便的在java应用程序中处理XML数据。JAXB提供了将XML文档解组为java内容树的方法,以及将java内容树重新编组回XML文档的方法。JAXB同样也提供了一种从java对象生成XML Schema的方式。

 

一、JAXB充当的角色

   

 

 

JAXB中常用的注解



 

 

 

 二、简单示例

    1、@XmlRootElement

        POJO:

       

package org.wy.pojo;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class User {
	private String name = "wy";
	private String sex = "man";
    public int age = 20;
    
    
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}	

 

       

JaxbTest.java

 

package org.wy.jaxb;

import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import org.wy.pojo.User;


public class JaxbTest {

	public static void main(String[] args) throws JAXBException {
		JAXBContext context = JAXBContext.newInstance(User.class);
		
		//JavaObject ---> XML
		Marshaller marshaller = context.createMarshaller();  
		User user = new User();
		marshaller.marshal(user, System.out);
		
		System.out.println();
		
		// XML---> JavaObject
		Unmarshaller unmarshaller = context.createUnmarshaller();
		String str = "<user><age>23</age></user>";
		user = (User)unmarshaller.unmarshal(new StringReader(str));
		System.out.println(user.age);
	}

}

 

输出结果:

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><age>20</age><name>wy</name></user>
23

 

从输出结果看到 性别没有转换到xml中,原因可以从后接口XmlAccessorType.java中找到原因

我们可以看到如下

 

@Inherited @Retention(RUNTIME) @Target({PACKAGE, TYPE})
public @interface XmlAccessorType {

    /**
     * Specifies whether fields or properties are serialized. 
     * 
     * @see XmlAccessType
     */
    XmlAccessType value() default XmlAccessType.PUBLIC_MEMBER;
}

 默认处理方式PUBLIC_MEMBER,处理public的。但是name是private的也转换成功了,原因是name被设置成了属性。

 

XmlAccessorType 有几种处理方式哪?

  查看枚举类XmlAccessType.java

  

public enum XmlAccessType {
    /**
     * Every getter/setter pair in a JAXB-bound class will be automatically
     * bound to XML, unless annotated by {@link XmlTransient}.
     *
     * Fields are bound to XML only when they are explicitly annotated
     * by some of the JAXB annotations.
     */
    PROPERTY,
    /**
     * Every non static, non transient field in a JAXB-bound class will be automatically
     * bound to XML, unless annotated by {@link XmlTransient}.
     *
     * Getter/setter pairs are bound to XML only when they are explicitly annotated
     * by some of the JAXB annotations.
     */
    FIELD,
    /**
     * Every public getter/setter pair and every public field will be
     * automatically bound to XML, unless annotated by {@link XmlTransient}.
     *
     * Fields or getter/setter pairs that are private, protected, or 
     * defaulted to package-only access are bound to XML only when they are
     * explicitly annotated by the appropriate JAXB annotations.
     */
    PUBLIC_MEMBER,
    /**
     * None of the fields or properties is bound to XML unless they
     * are specifically  annotated with some of the JAXB annotations.
     */
    NONE
}

 

 

当然JAXB也支持修改XML文档的根节点名称和命名空间,修改方式如下

@XmlRootElement(name="userwy", namespace="user-wy")

 

 

2、@XmlAccessorType

 

    POJO:

   

package org.wy.pojo;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class User {
	private String name = "wy";
	private String sex = "man";
    public int age = 20;
    
    
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}	

 

输出结果:

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><name>wy</name></user>
20

 

 

将@XmlAccessorType(XmlAccessType.FIELD)

 

输出结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><name>wy</name><sex>man</sex><age>20</age></user>
23

 

 

 3、@XmlJavaTypeAdapter

   复杂对象

   POJO:

  

package org.wy.pojo;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class User {
	private String name = "wy";
	private String sex = "man";
    public int age = 20;
    
    private Address address;
    
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@XmlJavaTypeAdapter(AddressAdapter.class)
	public Address getAddress() {
		return address;
	}

	public void setAddress(Address address) {
		this.address = address;
	}
	
	
}	

 

Address.java接口

package org.wy.pojo;

public interface Address {
   public String getAddress();
}

 

AddressImpl.java

  

package org.wy.pojo;

public class AddressImpl implements Address{
    private String address;

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

}

 

AddressAdapter.java

package org.wy.pojo;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class AddressAdapter extends XmlAdapter<String, Address> {

	@Override
	public Address unmarshal(String v) throws Exception {
		AddressImpl address = new AddressImpl();
		address.setAddress(v);
		return address;
	}

	@Override
	public String marshal(Address v) throws Exception {
		return v.getAddress();
	}

}

 

JaxbTest.java

 

  

package org.wy.jaxb;

import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import org.wy.pojo.AddressImpl;
import org.wy.pojo.User;


public class JaxbTest {

	public static void main(String[] args) throws JAXBException {
		JAXBContext context = JAXBContext.newInstance(User.class);
		
		//JavaObject ---> XML
		Marshaller marshaller = context.createMarshaller();  
		User user = new User();
		AddressImpl address = new AddressImpl();
		address.setAddress("BeiJing");
		user.setAddress(address);
		marshaller.marshal(user, System.out);
		
		System.out.println();
		
		// XML---> JavaObject
		Unmarshaller unmarshaller = context.createUnmarshaller();
		String str = "<user><age>23</age></user>";
		user = (User)unmarshaller.unmarshal(new StringReader(str));
		System.out.println(user.age);
	}

}

 

输出结果:

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><address>BeiJing</address><name>wy</name></user>
20

 

 

 

  • 大小: 20.2 KB
  • 大小: 25.9 KB
  • 大小: 24.1 KB
分享到:
评论

相关推荐

    WebService CXF 对应版本及资源

    WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- 3.2之前版本 java 6 3.1 ...

    WebService CXF学习文档

    做开发时,查了大量资料,发现一比较全面的资料,分享一下! WebService CXF学习——入门篇 1.CXF由来 2.HelloWorld 3.WSDL描述 WebService CXF学习——进阶篇 ...WebService CXF学习——JAXB剖析

    CXF-JAXB包的处理问题

    处理cxf版本和jaxb包中冲突问题,解决webservice中遇到的版本问题

    webservice实例 CXF的JAXWS和JAXRS实现 及JAXB标准接口实现带jar包

    webservice实例 CXF的JAXWS和JAXRS实现 及JAXB标准接口实现带jar包 全部手写,保证质量,导入就可以用

    cxf+spring webservice jar包

    cxf-services-sts-core-2.6.3.jar cxf-services-wsn-api-2.6.3.jar cxf-services-wsn-core-2.6.3.jar cxf-xjc-boolean-2.6.0.jar cxf-xjc-bug671-2.6.0.jar cxf-xjc-dv-2.6.0.jar cxf-xjc-runtime-2.6.0.jar cxf-xjc...

    maven3.04+spring3.2.8+cxf2.7.12+tomcat7实现RESTFul风格的webservice服务

    自己在网上找了很多cxf实现rest风格的文章也不少,但是都讲的不全面,也没有lib包,所以自己参考网上零散的文章,搞了大半天才成功的。现在把源码发上来,java代码只有12K,主要是lib里面的全部jar包(spring、cxf等...

    cxf-uw-ws-soap

    cxf的webservice, 基于soap的协议,soapui测试。 三大接口,jaxb解析XML

    cxf的jar包.rar

    利用Apache CXF开发webservice接口需要用到的jar集合 cxf-core-3.0.15.jar cxf-rt-bindings-soap-3.0.15.jar cxf-rt-bindings-xml-3.0.15.jar cxf-rt-databinding-jaxb-3.0.15.jar cxf-rt-frontend-jaxws-3.0.15.jar...

    apache-cxf-3.0.16-jar.zip

    //第三方系统的webservice Client client = dcf.createClient("http://localhost:9010/CxfWebservice?wsdl"); //第三方系统的webservice参数个数 Object[] obj = new Object[2]; obj[0]="CxfWebservice"; obj...

    cxf至少需要的jar包下载,集成Spring cxf jar下载

    cxf与spring集成 需要最少的jar如下: cxf-2.3.3.jar geronimo-annotation_1.0_spec-1.1.1.jar geronimo-jaxws_2.2_spec-1.0.jar geronimo-stax-api_1.0_spec-1.0.1.jar geronimo-ws-metadata_2.0_spec-1.1.3.jar ...

    apache-cxf-3.3.4.rar

    apache-cxf-3.3.4.zip wsdl webservice 通过wsdl2java的命令生成客户端代码 进入dos窗口,进入apache-cxf-2.3.1\bin所在的目录,输入指令: wsdl2java -p com.jaxb.client -d ../src -all E:\webService\**...

    jaxb-xjc-2.1.13.jar

    为了解决cxf webservice访问与jdk1.6版本之间不兼容问题

    jaxb-xjc-2.1.12.jar

    用java开发WebService应用时,如果使用到cxf,那么jaxb包是必须的辅助包,这里提供jaxb2.1.12包下载,用到的各位自然知道用处;

    CXF 和 Spring集成所需jar包

    cxf-2.2.9.jar geronimo-javamail_1.4_spec-1.7.1.jar geronimo-jaxws_2.2_spec-1.1.jar geronimo-jms_1.1_spec-1.1.1.jar geronimo-servlet_3.0_spec-1.0.jar jaxb-api-2.2.6.jar jaxb-impl-2.2.6.jar neethi-3.0.1...

    运用SpringDM和CXF来实现WebService的动态发布

    但随着JAXWS2.0、2.1版本的发布,通过大量使用JAVAannotation特性,以及运用JAXB20规范来统一数据展示,从而大大简化和规范了开发过程,一些新的开源框架也随之诞生。ApacheCXF就是其中的佼佼者。它实现了JCP与...

    axis调用webservice接口所需jar包.rar

    axis调用第三方webservice接口所需的jar包,包括axis-1.4.jar,axis-jaxrpc-1.3.jar,axis-jaxrpc-1.4.jar,commons-discovery-0.5.jar,commons-logging-1.2.jar,cxf-rt-databinding-jaxb-3.3.1.jar,javax.mail-...

    tutorial-soap-spring-boot-cxf:教程如何使用Spring Boot和Apache CXF创建,测试,部署,监视SOAP-Webservices

    向您展示如何设置一个简单的Spring Boot应用程序以及如何在嵌入式Tomcat中引导可运行的CXF-Framework。 从流行的汲取灵感,继承了一个完全更改的示例WebService-Definition作为WSDL 展示如何在构建时使用JAX-WS ...

Global site tag (gtag.js) - Google Analytics