当前位置: 首页 > 知识库问答 >
问题:

如何使抽象类与JAXB一起工作

元阳荣
2023-03-14
JAXBContext context = JAXBContext.newInstance(UserStorage.class);
                Marshaller m = context.createMarshaller();
                m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

the User class is ABSTRACT!, so it throws an 
import platform.UserStorage;
import platform.User;



public class UserTest {

private static final String USER_XML = "user2.xml";

public static void main(String[] args) throws JAXBException, IOException {

    ArrayList<User> userList = new ArrayList<User>();

    // create test users
            User user1 = new Admin();
            user1.setName("Dave");
            user1.setPass("1234");
            user1.setDeleted(true);
            user1.setBan(false);
            userList.add(user1);

            User user2 = new Admin();
            user2.setName("James");
            user2.setPass("1234");
            user2.setDeleted(true);
            user2.setBan(false);
            userList.add(user2);

            User user3 = new Admin();
            user3.setName("Mike");
            user3.setPass("1234");
            user3.setDeleted(true);
            user3.setBan(false);
            userList.add(user3);


            // create bookstore, assigning book
            UserStorage userstore = new UserStorage();
            userstore.setListName("Test List");
            userstore.setUserList(userList);

            // create JAXB context and instantiate marshaller
            JAXBContext context = JAXBContext.newInstance(UserStorage.class);
            Marshaller m = context.createMarshaller();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            m.marshal(userstore, System.out);

            Writer w = null;
            try {
                w = new FileWriter(USER_XML);
                m.marshal(userstore, w);
            } finally {
                try {
                    w.close();
                } catch (Exception e) {
                }
            }

            // get variables from our xml file, created before
            System.out.println();
            System.out.println("Output from our XML File: ");
            Unmarshaller um = context.createUnmarshaller();
            UserStorage userstore2 = (UserStorage) um.unmarshal(new FileReader(
                    USER_XML));

            for (int i = 0; i < userstore2.getUsersList().toArray().length; i++) {
                System.out.println("User " + (i + 1) + ": "
                        + userstore2.getUsersList().get(i).getName() + " Pass "
                        + userstore2.getUsersList().get(i).getPass());
            }}  }



package platform;


import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


//If you want you can define the order in which the fields are written
//Optional

/**
 * @author dinesh.kaushish, james.wyche //updated XML properties.
 * 
 */
@XmlRootElement(name = "user")
@XmlType(propOrder = { "name", "pass", "deleted", "ban" })
public abstract class User implements UserInterface {

private String name;
private String pass;
private boolean deleted;
private boolean ban;

/**
 * @ author dinesh.kaushish
 * @param String username
 * return void
 */

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

// If you like the variable name, e.g. "name", you can easily change this
    // name for your XML-Output:

/**
 * @author dinesh.kaushish
 * @param null
 * @return String user;
 */
@XmlElement(name = "user")
public String getName()
{
    return this.name;
}

/**
 * @author dinesh.kaushish
 * @param String pwd
 * @return void
 */
public void setPass(String pass)
{
    this.pass=pass;
}

/**
 * @author dinesh.kaushish
 * @param void
 * @return String password
 */
@XmlElement(name = "pass")
public String getPass()
{
    return pass;
}

/**
 * @author dinesh.kaushish
 * @param dFlag
 * @return void
 */
public void setDeleted(boolean deleted)
{
    this.deleted = deleted;
}

/**
 * @author dinesh.kaushish
 * @return boolean isDeleted
 */
@XmlElement(name = "deleted")
public boolean getDeleted()
{
    return deleted;
}


/**
 * @author dinesh.kaushish
 * @param bFlag
 */
public void setBan(boolean ban)
{
    this.ban = ban;
}

/**
 * @author dinesh.kaushish
 * @return Boolean isBanned
 */
@XmlElement(name = "ban")
public Boolean getBan()
{
    return ban;
}


public abstract void addUser();
public abstract void removeUser();
public abstract void verifyUser();
public abstract void passReset();
public abstract void faultReport();
public abstract void RequestsForAccess();
public abstract void UpdateDetails();
public abstract void BanUser();
public abstract void ChangePermissions();


    }



package platform;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashMap;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;

import java.util.ArrayList;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;





/**
 * @author michael.wambeek, james.wyche //added JAXB support.
 *
 */
//This statement means that class "Bookstore.java" is the root-element of our example
@XmlRootElement(namespace = "platform")
public class UserStorage {

// XmLElementWrapper generates a wrapper element around XML representation
    @XmlElementWrapper(name = "userList")
    // XmlElement sets the name of the entities
    @XmlElement(name = "user")
private ArrayList<User> userList;
private String listName = "";
public UserStorage(){

}

/**
 * @author michael.wambeek
 * 
 * Searches for a username and returns the password.
 * 
 * @param username The username to search for
 * @return The password of the correct username or null
 * @throws Exception
 */
public String findUser(String username) throws Exception{
    return search(username);
}

public boolean storeUser(String username, String password, UserType type){
    return true;
}

/**
 * @author james.wyche
 * @param userList
 */
public void setUserList(ArrayList<User> userList) {
    this.userList = userList;
}

/**
 * 
 * @return UserList
 */
public ArrayList<User> getUsersList() {
    return userList;
}

共有1个答案

程城
2023-03-14

这失败的原因是Jaxb将尝试创建User的实例。这是抽象的,因此是失败的。

在抽象类中添加注释

@XmlTransient //Prevents the mapping of a JavaBean property/type to XML representation
@XmlSeeAlso({Admin.class, <other class>}) //Instructs JAXB to also bind other classes when binding this class

请参阅每个(XmlTransient,XMLSeeAll)的javadoc

 类似资料:
  • 问题内容: 我正在尝试使用JAXB解组一些XML,但出现“无法创建…的实例”异常。我知道为什么- 它试图建立一个抽象类的实例。我想要的是让它成为特定实现类的实例。我的目标是对setter方法进行特定于类的检查。对于BarImpl,也许“ qux”是有效的baz值,但BarImpl2想要做其他事情。 我没有通过注释Foo来实现这一目标,但是如果我不注释bar,事情就会变得很丑。 问题答案: 您可以执

  • 问题内容: 运行代码时出现该错误。好的,很好-我只是忘记了获取XMLBeans …,但是它已经退休了,我在他们的档案中找不到最新版本。因此,我发现JAXB可以替代,我下载了JAXB并尝试将jar文件添加到Intellij的库中,但是在寻找XMLBeans依赖项时仍然遇到相同的错误。 如何获得Apache POI以使用JAXB代替XMLBeans?为什么JAXB有7种不同的jar文件,而我却找不到它

  • 问题内容: 我今天遇到了一种情况,其中Java没有调用我期望的方法- 这是最小的测试用例:(很抱歉,这似乎是人为设计的-“现实世界”场景要复杂得多,并且更有意义从“究竟为什么会怎么做 那 ?”的立场。) 我对为什么会发生这种情况特别感兴趣,我不在乎重新设计的建议。我觉得这是Java Puzzlers中的功能,但是我没有副本。 请参见下面的Test .getValue()中的特定建议问题: 此代码的

  • 我正在尝试用库制作一个程序。 当我尝试访问一个头函数时,我得到了一个错误。 main.cpp: 测试h: 我是初学者,所以我真的不知道如何修复它或它的可能性。

  • 好啊我是JAXB新手,我对XmlID和XmlIDREF有一些问题,其中ID位于抽象类中。 我的问题是: 此类包含一个抽象实体,在本例中是一个字符串。 此类包含两个列表,一个列表包含“SomeClass”的实例,另一个列表包含“EntityImpl”的实例 impl被添加到res,res和impl都被添加到根目录上各自的列表中。 我想要的结果是引用SomeClass实体中impl的Id,但结果是:

  • 我做了一些研究,我已经读了这本指南。 在Application.Properties中配置了h2数据库的项的我的存储库 实现接口并接受bean的服务: 然后是接受bean的控制器: 我还在我的抽象类上尝试了另一种策略: 还是没有雪茄。同样的错误。有没有人能给我一点启示,对于被其他实体扩展的抽象实体,使用Spring Boot和JPA的正确方法?