помогите разобраться с JAXB

 
 
 
Сообщения:129
здравствуйте

я опишу идею

есть объект какойто (даже список объектов), у него несколько свойств
описание этого объекта их XML должно попасть HashTable<String,String>, или HashMap<String,String> тут не столь важно
одно из свойств этого объект должно быть ключем хеша, остальные свойства через попасть в значание ключа хеща как POJO

кручу кручу и что то пока не выходит
пока реализовал по простому
все объекты кидаются в ArrayList<POJO> а потом лишними телодвижениями преобразовываются в то что нужно
но хочется все таки покрасивей сделать

никто не подскажет как?

приблизительный хмл такой
<config>
  <clients>
    <client ip="127.0.0.1">
      <id>local</id>
      <access>full</access>
    </client>
    <!--  etc -->
  </clients>
</config>

Солнце светит тебе пока ты светишь солнцу.
 
 
Сообщения:689
Не совсем понятно что по вашему примеру должно попасть в HashMap'у в качестве ключа?
 
 
Сообщения:129
прошу прощения - стормозил ))

в данном случае
ip => key
{id, access} => value

но это приблизительный XML, который мне показался...максимально прилиженным к тому что нужно
но на самом деле я не знаю подойдет ли именно такая форма для решения пролемы или ее нужно будет поменять

Солнце светит тебе пока ты светишь солнцу.
 
 
Сообщения:689
lexand:
прошу прощения - стормозил ))
в данном случае
ip => key
{id, access} => value


Мне кажется разумней было бы использовать конструкцию
HashMap<String, Client>

где Client класс, со своими пропертями и аттрибутами
 
 
Сообщения:129
Client - это POJO в котором есть id, access и куча другого
но этот клент должен быть доступен по ключу-ip

наверно я таки изначально не правильно вопрос задал

как мне расписать аннотации в классе что бы приведенный пример XML (или его вариации)
превратились в
HashMap<String, Client>

???

или такое впринципе не возможно стандартным методом и надо писать что то дополнительно ?

Солнце светит тебе пока ты светишь солнцу.
Изменен:20 дек 2012 09:20
 
 
Сообщения:689
Да, для HashMap'a надо писать дополнительно. Читайте про @XmlJavaTypeAdapter и XmlAdapter
 
 
Сообщения:129
ага
уже смотрю http://www.coderanch.com/t/534260/XML/JAXB-HashMap
но пока как баран на новые ворота ))

Солнце светит тебе пока ты светишь солнцу.
 
 
Сообщения:129
все разобрался

оказалось не сильно сложно
хотя у меня закралось подозрение, а стоит ли оно такого "извращения"? ))

может кому пригодится

public class JAXBTest {

    @Test
    public void loadXmlClientsViaAttrs() throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(ClientConfig.class);
        Unmarshaller m = context.createUnmarshaller();
        ClientConfig cfg = (ClientConfig) m.unmarshal(new File("QueueProtocol/src/test/resources/clientsViaAttr.xml"));

        assertEquals(2, cfg.getClients().size());
    }
}

@XmlRootElement(name = "config")
@XmlAccessorType(XmlAccessType.FIELD)
class ClientConfig {
    @XmlElement
    @XmlJavaTypeAdapter(ClientAdapter.class)
    private Map<String, Client> clients;

    public Map<String, Client> getClients() {
        return clients;
    }

}

class Client {
    @XmlAttribute(name = "ip", required = true)
    String ip;
    @XmlElement(name = "id", required = true)
    String id;
}

class Clients {
    @XmlElement(name = "client", required = true)
    Client[] clients;
}

class ClientAdapter extends XmlAdapter<Clients, Map<String, Client>> {
    @Override
    public Map<String, Client> unmarshal(Clients clients) throws Exception {
        Map<String, Client> map = new HashMap<String, Client>(clients.clients.length);
        for (Client client : clients.clients)
            map.put(client.ip, client);
        return map;

    }

    @Override
    public Clients marshal(Map<String, Client> map) throws Exception {
        Clients clientsCont = new Clients();
        Collection<Client> clients = map.values();
        clientsCont.clients = clients.toArray(new Client[clients.size()]);
        return clientsCont;
    }
}


у меня другой вопрос назрел
как по вот этому сегенерировать схему спомощью schemagen?

Солнце светит тебе пока ты светишь солнцу.
 
 
Сообщения:129
тьфу
сгенерировал ))
надо указать утилите ClientsConfig класс и она сгененрирует все что нужно

Солнце светит тебе пока ты светишь солнцу.
 
 
Сообщения:689
lexand:
тьфу
сгенерировал ))
надо указать утилите ClientsConfig класс и она сгененрирует все что нужно


Да, надо скормить утилите XJC из JAXB
 
 
Сообщения:17
можно тут продолжить тему?

написал для одного из свойств класса XmlAdapter ... и вот в результате имею вот такой дефект

<IssueDate xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">01-01-2000</IssueDate>


а хотелось бы просто

<IssueDate>01-01-2000</IssueDate>
Изменен:28 дек 2016 09:00
 
 
Сообщения:689
Это потому что декларация типа поля IssueDate одна, а содержание другого типа.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет