java - 在编码之前我是否需要传入要绑定(bind)在 JAXBContext 中的所有类

标签 java xml class jaxb

我正在开发一个项目,需要从服务器检索 json 对象并将其转换为 xml 格式。

现在,它工作正常,但我想确保我以正确的方式做。

我有这些应该绑定(bind)的java类。

@XmlRootElement
public class Message {

@XmlElement
private String status;

@XmlElement
private String details;

//getters and setters
}


@XmlRootElement
public class Response extends Message {

@XmlElement
private List<Case> cases;

//getters and setters
}


@XmlRootElement
public class Case {

@XmlElement
private id;

@XmlElement
private name;

//gettersand setters
}

现在,这就是我在操作类中所做的,效果很好:请注意,我传入了我想要绑定(bind)的所有类。

public class StrutsAction {

public execute() {
    //initial logic

    JAXBContext jaxbContext = JAXBContext.newInstance(Response.class, Message.class, Case.class);
    Marshaller marshaller = jaxbContext.createMarshaller(); 
    StringWriter sw = new StringWriter();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(reponse, sw);
    return new  ByteArrayInputStream(sw.toString().getBytes("UTF-8"));
}
}

我尝试这样做,它仍然有效:这里我只是在 Response.class 中传递 ed

public class StrutsAction {

public execute() {
    //initial logic

    JAXBContext jaxbContext = JAXBContext.newInstance(Response.class);
    Marshaller marshaller = jaxbContext.createMarshaller(); 
    StringWriter sw = new StringWriter();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(reponse, sw);
    return new  ByteArrayInputStream(sw.toString().getBytes("UTF-8"));
}
}

现在,在我的实际项目中,我有更多的类需要绑定(bind),并且如果可能的话,我不想在调用 JAXBContext.newInstance(class...) 时传递所有类。那么有人可以告诉我最好的方法吗?我什么时候应该传入所有要绑定(bind)的类。我还没有完全理解文档上的内容。

我添加了这个生成响应的辅助方法,以使我的代码更清晰:

public static InputStream generateSuccessMsgResponse(Object object, Class<?>...classes) {
    try {
        JAXBContext jaxbContext = JAXBContext.newInstance(classes);
        Marshaller marshaller = jaxbContext.createMarshaller(); 
        StringWriter sw = new StringWriter();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(object, sw);
        return new ByteArrayInputStream(sw.toString().getBytes("UTF-8"));
    } catch (PropertyException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (JAXBException e) {
        e.printStackTrace();
    }
    return null;
}

但是每当我调用它时,我仍然必须传递所有绑定(bind)类:

public String execute() {
inputStream = MethodUtil.generateSuccessMsgResponse(ResponseObj, Response.class, Message.class, Case.class, OtherClass.class, AnotherClass.class);                                                                                                                                                                                                                                                                                                                                                              
}

所以我真正的问题是我必须通过所有这些类(class)吗?因为如果我只是传入 Response.class,它的工作原理是一样的。

最佳答案

您可以获取对象的类并将其传递给 JAXBConext。像这样的事情:

    public static String unparse(Object object, String encoding) throws JAXBException, SQLException {
        JAXBContext jc = JAXBContext.newInstance(object.getClass());
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);        
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter writer = new StringWriter();
        marshaller.marshal(object, writer);
        return writer.toString();
    }

用法:

    public void execute() { 
        String messageXml = unparse(messageObject, "UTF-8");
        String responseXml = unparse(responseObject, "UTF-8");
        String caseXml = unparse(caseObject, "UTF-8");
    }

关于java - 在编码之前我是否需要传入要绑定(bind)在 JAXBContext 中的所有类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39890937/

相关文章:

java - 在 Spring 中创建对象池

java - 媒体扫描仪连接未更新

css - 在 Sencha ExtJS 框架中应该删除什么 CSS 类的组件事件? (烦人的红线)

class - 是否可以将一个类的代码分发到多个文件?

java - 有谁知道 Hibernate 和 java 是否可以有效地与 Access 一起工作?

java - 从java发送int到c

java - 使用leve包从xsd文件生成java类

perl - 在 Perl 中生成 getter 和 setter 而不是硬编码它们有缺点吗?

php - 使用 PHP 将 XML 转换为 CSV,但有一些变化

sql-server - SSIS WebService 任务插入 XML header