为单个jaxb实例传递两个不同的类

时间:2018-04-26 22:52:45

标签: java jaxb singleton marshalling unmarshalling

下面是我创建jaxb实例的单例类。 我正在使用contextObject进行编组和解组。但在这两种情况下,我的代码都有不同的.class(Class abc)。问题是contextObj只会创建一次,因为只有一个类可以说是编组。但我正在使用另一个.class进行解组。那我怎么能在这段代码中做到这一点?感谢

public class JAXBInitialisedSingleton {

    private static JAXBContext contextObj = null;

    private JAXBInitialisedSingleton() {

    }

    public static JAXBContext getInstance(Class abc) {
        try {
            if (contextObj == null) {
                contextObj = JAXBContext.newInstance(abc);
            }
        } catch (JAXBException e) {
            throw new IllegalStateException("Unable to initialise");
        }
        return contextObj;
    }
}

2 个答案:

答案 0 :(得分:0)

您已经注意到单个对象JAXBContext contextObj 还不够。

相反,您需要从Class个对象到JAXBContext个对象的Map<Class, JAXBContext>映射。

您需要稍微重新组织getInstance(Class)方法。 只需要更改3行(标有//!!)。 在Map中,您保留了目前为止创建的所有JAXBContext个对象。 每当您需要之前已创建的JAXBContext时, 您可以在Map中找到它,并可以重复使用它。

public class JAXBInitialisedSingleton {

    private static Map<Class, JAXBContext> contextMap = new HashMap<>();  //!!

    private JAXBInitialisedSingleton() {
    }

    public static JAXBContext getInstance(Class abc) {
        JAXBContext contextObj = contextMap.get(abc);        //!!
        try {
            if (contextObj == null) {
                contextObj = JAXBContext.newInstance(abc);
                contextMap.put(abc, contextObj);             //!!
            }
        } catch (JAXBException e) {
            throw new IllegalStateException("Unable to initialise");
        }
        return contextObj;
    }
}

答案 1 :(得分:0)

## You can try like below -##


public final class JAXBContextConfig
{
    private JAXBContextConfig()
    {
    }

    public static final JAXBContext JAXB_CONTEXT_REQ;

    public static final JAXBContext JAXB_CONTEXT_RES;


    static
    {
        try
        {
            JAXB_CONTEXT_REQ = JAXBContext.newInstance(Request.class);
            JAXB_CONTEXT_RES = JAXBContext.newInstance(Response.class);

        }
        catch (JAXBException e)
        {
            throw new ManhRestRuntimeException(e);
        }
    }

}