Передача двух разных классов для одного экземпляра jaxb - PullRequest
0 голосов
/ 27 апреля 2018

Ниже приведен мой одноэлементный класс, который создает экземпляр 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 голосов
/ 25 сентября 2018
## 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);
        }
    }

}
0 голосов
/ 27 апреля 2018

Вы уже заметили, что один объект JAXBContext contextObj недостаточно.

Вместо этого вам нужно Map<Class, JAXBContext> отображение от 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;
    }
}
...