Формат даты в ответ на оставшийся POST API - PullRequest
0 голосов
/ 19 октября 2018

Я создаю POST API в весенней загрузке + kotlin.Я создаю объект LocalDate, но ответ не нужен.Я использовал

org.springframework.format.annotation.DateTimeFormat

Что я получаю, это что-то вроде:

<user>
    <email>a@mail.com</email>
    <lname></lname>
    <fname></fname>
    <birthday>
            <year>2000</year>
            <month>JANUARY</month>
            <chronology>
                <id>ISO</id>
                <calendarType>iso8601</calendarType>
            </chronology>
            <dayOfMonth>1</dayOfMonth>
            <dayOfWeek>SATURDAY</dayOfWeek>
            <era>CE</era>
            <dayOfYear>1</dayOfYear>
            <leapYear>true</leapYear>
            <monthValue>1</monthValue>
    </birthday>
</user>

То, что я хочу, эточто-то вроде (в частности, birthDay tag):

<user>
    <email>a@mail.com</email>
    <lname></lname>
    <fname></fname>
    <birthday>2000-01-01</birthday>
</user>

Вот код:

dto class:

import org.springframework.format.annotation.DateTimeFormat
import java.time.LocalDate

@JacksonXmlRootElement
data class User (var email: String? = "",
    var lname: String = "",
    var fname: String = "",

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    var birthday: LocalDate? = null)

класс контроллера:

@RestController
@RequestMapping("/")
class Controller {


    @PostMapping("/post")
    fun registerByMail(@Valid body: User) : ResponseEntity<Any> {
    .
    .
    .
    var user = User(birthDay = body.birthDay)
    return ResponseEntity.ok(user)

Пожалуйста, дайте мне знать, где я делаю неправильно.Я делаю POST-запрос, используя почтальон.

Edit : Я также попробовал решение, упомянутое здесь: JSON Java 8 LocalDateTime формат в Spring Boot , но это также неработал для меня.

Когда я использую аннотацию com.fasterxml.jackson.annotation.JsonFormat и требуемую зависимость, я получаю следующую ошибку:

<defaultMessage>Failed to convert value of type 'java.lang.String[]' to 
required type 'java.time.LocalDate'; nested exception is 
org.springframework.core.convert.ConversionFailedException: Failed to 
convert from type [java.lang.String] to type 
[@com.fasterxml.jackson.annotation.JsonFormat java.time.LocalDate] for value 
'2000-01-01'; nested exception is java.lang.IllegalArgumentException: Parse 
attempt failed for value [2000-01-01]</defaultMessage>

1 Ответ

0 голосов
/ 19 октября 2018

Вы должны аннотировать поле @field:JsonSerialize, а не свойство.Помимо этого вы должны использовать @JsonFormat

@JacksonXmlRootElement
data class User(
    var email: String? = "",
    var lname: String = "",
    var fname: String = "",

    @field:JsonFormat(pattern = "yyyy-MM-dd")
    @field:JsonSerialize(using = LocalDateSerializer::class)
    @field:JsonDeserialize(using = LocalDateDeserializer::class)
    var birthday: LocalDate? = null
)

Мой маленький тест:

val mapper = XmlMapper()
val xml = mapper.writeValueAsString(User(birthday = LocalDate.now()))
println(xml)

Генерирует следующий вывод:

<User><email></email><lname></lname><fname></fname><birthday>2018-10-19</birthday></User>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...