Можно ли игнорировать класс-оболочку во время сортировки JAXB

Я пытаюсь заставить JAXB игнорировать класс-оболочку во время процесса Mashalling, имеет смысл иметь этот класс-оболочку в коде, поскольку он хранит всю связанную информацию вместе, однако мне нужно избавиться от нее во время процесса маршалинга. Ниже приведен соответствующий код.

@XmlType(name = "root")
@XmlRootElement(name = "root")
public class Root {

    @XmlElementRef
    private List<Resource> resources = new ArrayList<>();

    public void addResource(Resource resource) {
        resources.add(resource);
    }
}


@XmlRootElement(name = "", namespace = "")
@XmlAccessorType(XmlAccessType.NONE)
public class Resource {

    @XmlElementRef
    private Element element;
    @XmlElementRef
    private FieldType fieldType;
    @XmlElementRef
    private ListType listType;
}

Корень - это основной объект, а Ресурс - это объект-оболочка, для которого я не хотел бы создавать узел. Однако я все еще хочу, чтобы Element, FieldType и ListType в Resource отображались.

Вот что у меня сейчас есть:

<root>
    <>
        <element name="resource1"/>
        <fieldType name="resource1--type">
        </fieldType>
        <listType name="resource--list">
        </listType>
    </>
    <>
        <element name="resource2"/>
        <fieldType name="resource2--type">
        </fieldType>
        <listType name="resource2--list">
        </listType>
    </>
</root>

То, чего я хотел бы достичь, это следующее:

<root>
    <element name="resource1"/>
    <fieldType name="resource1--type">
    </fieldType>
    <listType name="resource--list">
    </listType>
    <element name="resource2"/>
    <fieldType name="resource2--type">
    </fieldType>
    <listType name="resource2--list">
    </listType>
</root>

Я не знаю, возможно ли это, но любая помощь будет принята с благодарностью.

Благодарю.

Ответы на вопрос(3)

Решение Вопроса

Вы не можете достичь этого в JAXB. Даже если вы сможете сериализовать таким образом, например, с помощью XmlAdapter, десериализовать его будет невозможно.

Попробуй это:

@XmlType(name = "root")
@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.NONE)
public class Root {

    private ArrayList<Resource> resources = new ArrayList<Resource>();

    public void addResource(Resource resource) {
        resources.add(resource);
    }

    @XmlElementRefs(value = { @XmlElementRef(type = Element.class),
                              @XmlElementRef(type = ListType.class),
                              @XmlElementRef(type = FieldType.class) })
    public List<Object> getResourceFields() {
        List<Object> list = new ArrayList<Object>();
        for (Resource r : resources) {
            list.add(r.getElement());
            list.add(r.getFieldType());
            list.add(r.getListType());
        }
        return list;
    }
}

В принципеgetRerourceFields объединяет все ресурсы & apos; поля в том же списке. Если вы не можете изменитьRoot класс, это может быть вашимRootAdapter и используйте его как предложено @Biju.

 Ruaghain07 июн. 2012 г., 15:48
Тибтоф, ты ученый друг! Это разобрало меня, высоко ценится.
 07 июн. 2012 г., 15:29
Смотрите обновленный ответ для обходного пути!
 Ruaghain07 июн. 2012 г., 14:13
Привет Тибтоф. К счастью, все, что мне нужно для сериализации, мне не нужно беспокоиться о десериализации. Поэтому, если вы думаете, что это возможно, это было бы замечательно.
 07 июн. 2012 г., 16:44
Хорошая @tibtof, очень умная идея, +1

Вам, вероятно, придется создать XmlAdapter для вашего корневого класса, этот адаптер должен в основном отображать ваши корневые экземпляры в другой тип, где вы можете сгладить корневую структуру перед маршалингом - по следующим направлениям:

public class CustomRootAdapter extends
                    XmlAdapter<CustomRoot,Root>> {
@Override
public Root unmarshal(CustomRoot v) throws Exception {
    return null;//if you are not keen on unmarshalling..
}
@Override
public CustomRoot marshal(Root v) throws Exception {
    return ...;
}    

}

Вы можете зарегистрировать этот пользовательский адаптер, используя:

@XmlJavaTypeAdapter(CustomRootAdapter.class) с вашимRoot учебный класс

 06 окт. 2012 г., 07:18
Вы правы !
 06 окт. 2012 г., 04:30
-1, поскольку аннотация XmlJavaTypeAdapter не может использоваться с аннотацией XmlRootElement. Увидетьjavadocs

Это звучит как то, что@XMLTransient делает.

When placed on a class, it indicates that the class shouldn't be mapped to XML by itself. Properties on such class will be mapped to XML along with its derived classes, as if the class is inlined.

УвидетьJavadoc

 07 июн. 2012 г., 13:48
Вы поместили @XMLTransient в приватное поле, которое хотите игнорировать? Были ли другие аннотации JAXB в этой области? Вы оставили все другие аннотации JAX в классе Resource, как в примере выше?
 Ruaghain07 июн. 2012 г., 13:40
Привет Джон, спасибо за ответ. Я пытался это сделать, но он продолжал выдавать мне следующую ошибку: Invalid XmlElementRef: Тип & quot; class ... classes.root.Resource & quot; или любой из его подклассов не известен в этом контексте. Это происходит, когда у меня есть только XmlTransient в классе Resource. Не слишком уверен, что там происходит.
 Ruaghain07 июн. 2012 г., 13:58
Сначала я поместил XmlTransient в личный список в классе Root. Вместо XmlElementRef. Это не вызывало исключения, но не отображало ни один из классов, содержащихся в классе Resource. Затем я включил сам класс Resource, но это породило вышеприведенное исключение. Я пробовал несколько комбинаций, оставляя аннотации JAX в них, удаляя их. Каждый раз я получал исключение.

Ваш ответ на вопрос