Сравнивая два 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")
. Это создало дополнительный элемент оболочки вне ваших элементов списка с указанным именем.
Итак, я правильно назвал корневой элемент и удалил создание дополнительного элемента-оболочки.