Как исключить корневой тег -элемент из оболочки jaxb? - PullRequest
0 голосов
/ 07 ноября 2018

есть приложение на весну + jaxb + jpa

Итак, я отдыхаю - контроллеры и jaxv Элементы:

@AllArgsConstructor
@NoArgsConstructor
@XmlRootElement(name = "root")
@Getter
public class UserWrapper {
    @XmlElementWrapper(name = "Users")
    @XmlElement(name = "User")
    private List<User> Users;

    @XmlElement(name="UserError")
    private UserError error;
}


@Getter
@Setter
@XmlRootElement(name="User")
@NoArgsConstructor
public class User{
  @XmlElement
  private String name;
  @XmlElement
  private String surname;
}

Существуют сущность пользователя и оболочка для списка пользователей.

Ответ от моего контроллера:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <Users>
        <User>
            <Name>AAA</Name>
            <Surname>AAA</Surname>
        </User>
        <User>
            <Name>BBB</Name>
            <Surname>BBB</Surname>
        </User>
    </Users>
</root>

Как сделать ответ без тега?

Контроллер покоя:

@RequestMapping(value = "/users", method = RequestMethod.GET)
    public @ResponseBody UsersWrapper findByParams(
            @RequestParam(value = "id") String id) throws Exception {
        RiskMetricError error = null;
        List<User> users = userService.find(id);

        return (new UsersWrapper(users, error));
    }

P.S. Мне нужно сделать ответ XML как это:

        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <Users>
            <User>
                <Name>AAA</Name>
                <Surname>AAA</Surname>
            </User>
            <User>
                <Name>BBB</Name>
                <Surname>BBB</Surname>
            </User>
        </Users>

1 Ответ

0 голосов
/ 08 ноября 2018

Сравнивая два xmls (фактических и желаемых), вы не хотите, чтобы пользовательский контент находился в пределах <root>. Вы можете сделать это:

@XmlRootElement(name = "Users")
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class Users {

    @XmlElement(name = "User")
    private List<User> users;
}

Тогда пользователь будет:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class User {

    @XmlElement(name = "Name")
    private String name;
    @XmlElement(name = "Surname")
    private String surname;
}

Небольшое приложение для весенней загрузки, чтобы попробовать его:

@RestController
public class UsersEndpoint {

    @GetMapping("/users")
    public Users getUsers() {
        List<User> users = new ArrayList<>();
        users.add(new User("name1", "surname1"));
        users.add(new User("name2", "surname2"));

        return new Users(users);
    }
}

Вернет это:

<Users>
    <User>
        <Name>name1</Name>
        <Surname>surname1</Surname>
    </User>
    <User>
        <Name>name2</Name>
        <Surname>surname2</Surname>
    </User>
</Users>

Обновление для ответа на комментарий (уточните ответ):

Ваши POJO и структура xml должны совпадать. Аннотации помогают «сгладить» различия. У вас было <root></root>, потому что у вашего корневого класса UserWrapper была эта аннотация: @XmlRootElement(name = "root"). Если бы в названии у вас было "бла", внешние теги (<root></root>) были бы <blah></blah>. Кроме того, над списком пользователей у вас была эта аннотация: @XmlElementWrapper(name = "Users"). Это создало дополнительный элемент оболочки вне ваших элементов списка с указанным именем.

Итак, я правильно назвал корневой элемент и удалил создание дополнительного элемента-оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...