加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

webservice+annotation---ONE

发布时间:2020-12-17 01:06:19 所属栏目:安全 来源:网络整理
导读:?? ? 昨天接手一个webservice项目,算是二次开发吧,,看了两天webservice和annotation,记录下我的学习笔记 ? ? 注解: ???? @XmlAccessor(XmlAccessType.Field)表示 注解(@XmlElement name="")字段要加在字段上面,如果没有@XmlAccessor注解的话要将@Xml
??

?昨天接手一个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","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中标注的根元素名标志的。

?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读