webservice+annotation---ONE

来源:互联网 发布:nlpir java 使用 编辑:程序博客网 时间:2024/05/29 16:10
  

 昨天接手一个webservice项目,算是二次开发吧,,看了两天webservice和annotation,记录下我的学习笔记

 

 

注解:

     @XmlAccessor(XmlAccessType.Field)表示 注解(@XmlElement name="")字段要加在字段上面,如果没有@XmlAccessor注解的话要将@XmlElement注解加在方法上(个人认为:应该是默认是加在getter方法上面)。

      @XmlRootElement(name="")生成的xml文件的根元素。

       javabean类一定要有个无参构造函数,因为要在字段赋值时用到无参构造函数,否则会报异常:

      does not have a no-arg default constructor

      嵌套元素,诸如:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<student>
    <class>
        <班级编号>software</班级编号>
    </class>
    <学号>1001</学号>
    <姓名>sun</姓名>
</student>

需要构造一静态内部类,因为内部类不需要访问外围类中的数据,所以设置为静态类(构造内部类对象时不需要外围类的对象),代码如下:

//@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "student")
@XmlType(propOrder = { "classId", "id", "stuName" })
public class Student {
 private int id;
 private String stuName;
 private ClassId classId;

 public static class ClassId {
  private String className;

  public ClassId(String className) {
   this.className = className;
  }

  public ClassId() {
  }

  @XmlElement(name = "班级编号")
  public String getClassName() {
   return className;
  }

  public void setClassName(String className) {
   this.className = className;
  }
 }

 public Student(int id, String stuName) {
  this.id = id;
  this.stuName = stuName;
 }

 public Student() {
 }

 @XmlElement(name = "学号")
 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 @XmlElement(name = "姓名")
 public String getstuName() {
  return stuName;
 }

 public void setstuName(String stuName) {
  this.stuName = stuName;
 }

 @XmlElement(name = "class")
 public ClassId getClassId() {
  return classId;
 }

 public void setClassId(ClassId classId) {
  this.classId = classId;
 }
}

之所以要注释掉@XmlAccessorType,是因为注解是加在getter方法上的,否则会出现

There are two properties named "classId" 异常

因为在生成XML文件时,元素的出现位置是随机的,如果要固定元素的前后位置,就要加入@XmlType(proOrder={})注解。

2、编组List对象,诸如:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<学校>
    <school>
        <班级>
            <班级编号>software</班级编号>
        </班级>
        <学号>1001</学号>
        <姓名>sun</姓名>
    </school>
    <school>
        <班级>
            <班级编号>software</班级编号>
        </班级>
        <学号>1002</学号>
        <姓名>klov</姓名>
    </school>
</学校>

 则需要

//@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "学生")
@XmlType(propOrder = { "classId", "id", "stuName" })
public class Student {
 private int id;
 private String stuName;
 private ClassId classId;

 public static class ClassId {
  private String className;

  public ClassId(String className) {
   this.className = className;
  }

  public ClassId() {
  }

  @XmlElement(name = "班级编号")
  public String getClassName() {
   return className;
  }

  public void setClassName(String className) {
   this.className = className;
  }
 }

 public Student(int id, String stuName) {
  this.id = id;
  this.stuName = stuName;
 }

 public Student() {
 }

 @XmlElement(name = "学号")
 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 @XmlElement(name = "姓名")
 public String getstuName() {
  return stuName;
 }

 public void setstuName(String stuName) {
  this.stuName = stuName;
 }

 @XmlElement(name = "班级")
 public ClassId getClassId() {
  return classId;
 }

 public void setClassId(ClassId classId) {
  this.classId = classId;
 }
}

School类

 

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "学校")
public class School {
// @XmlElement(name = "student")
 @XmlElements(value = { @XmlElement(type=Student.class)})
 private List<Student> school = new ArrayList<Student>();

 public List<Student> getSchool() {
  return school;
 }

 public void setSchool(List<Student> school) {
  this.school = school;
 }
 
 public synchronized void addStu(Student stu){
  if(school == null){
   school = new ArrayList<Student>();
  }
  school.add(stu);
 }
}

 

测试类

@Test
 public void testGetId() {
  Student stu = new Student(1001, "sun") ;
  Student stu2 = new Student(1002, "klov") ;
  Student.ClassId classId = new Student.ClassId("software");
  stu.setClassId(classId);
  stu2.setClassId(classId);
  
  List<Student> stuList = new ArrayList<Student>();
  stuList.add(stu);
  stuList.add(stu2);
  School school = new School();
  school.setSchool(stuList);
  
  try {
   JAXBContext jc = JAXBContext.newInstance(School.class);
   Marshaller marshall = jc.createMarshaller();
   marshall.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
   marshall.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
   StringWriter writer = new StringWriter();
   marshall.marshal(school, writer);
   System.out.println(writer);
  } catch (JAXBException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }

//不知为何会有<school>标签

原来默认是以private List<Student> school 字段名标识的,而不是以List中标注的根元素名标志的。

 

--------------如果想拒绝别人的批评,那就只能做个无脑无能无为无知的人--------------------

 

 

原创粉丝点击