Контроллер получения объекта с нулевыми полями - PullRequest
0 голосов

Учим Котлин.

У меня есть DTO.

@JsonInclude(JsonInclude.Include.NON_EMPTY)
open class AbstractDto : Serializable {

    open var id: Long? = null
    open var created: LocalDateTime? = null
    open var updated: LocalDateTime? = null
}

open class UserDto : AbstractDto() {

    open var height: Int? = null
    open var weight: Double? = null
    open var gender: String? = null
    open var birthDate: LocalDateTime? = null
    open val contacts: List<ContactDto> = ArrayList()
}

У меня есть контроллер, который наследует абстрактный класс, который наследует интерфейс:

@RestController
@RequestMapping("/user")
@ControllerImpl
class UserController : AbstractController<User, UserDto, UserMapper, UserRepository, UserServiceImpl>()

open class AbstractController<
        E : AbstractEntity,
        D : AbstractDto,
        M : AbstractMapper<E, D>,
        R : CommonRepository<E>,
        S : AbstractService<E, D, M, R>
        > : CommonController<D> {

    private val service: S? = null

    override fun save(dto: D?): ResponseEntity<D> = ResponseEntity.ok(service!!.save(dto)!!)

    override fun update(dto: D): ResponseEntity<D> = ResponseEntity.ok(service!!.update(dto)!!)

    override fun get(id: Long): ResponseEntity<D> = ResponseEntity.ok(service!!.get(id)!!)

    override fun getAll(pageable: Pageable): ResponseEntity<Page<D>> = ResponseEntity.ok(service!!.getAll(pageable))

    override fun delete(id: Long): ResponseEntity<Boolean> = ResponseEntity.ok(service!!.delete(id))
}

interface CommonController<D : AbstractDto> {

    @PostMapping
    fun save(dto: D?): ResponseEntity<D>

    @PutMapping
    fun update(dto: D): ResponseEntity<D>

    @GetMapping("/all")
    fun get(id: Long): ResponseEntity<D>

    @GetMapping
    fun getAll(pageable: Pageable): ResponseEntity<Page<D>>

    @DeleteMapping
    fun delete(id: Long): ResponseEntity<Boolean>
}

Отправка POST-запроса:

{
    "height": 180,
    "weight": 75,
    "user": 1
}

Мой контроллер напоминает DTO, в котором все поля пусты. Совет, что не так? Он работал в простом контроллере, прежде чем перейти к абстракции.

1 Ответ

0 голосов
/ 21 июня 2019

Вы должны пройти небольшой курс Kotlin, потому что кажется, что вы не очень много понимали в написании OO на Kotlin.

Вы можете сделать что-то вроде этого:

open class AbstractDto(open var id: Long? = null,
                       open var created: LocalDateTime? = null,
                       open var updated: LocalDateTime? = null)


open class UserDto(override var id: Long? = null,
                   override var created: LocalDateTime? = null,
                   override var updated: LocalDateTime? = null,
                   var height: Int? = null
                   var weight: Double? = null
                   var gender: String? = null
                   var birthDate: LocalDateTime? = null
                   val contacts: List<String> = ArrayList()) : AbstractDto(id,
        created,
        updated
) 

Вы инициализируете свойОбнулить поля без использования конструктора, чтобы их нельзя было изменить.Если вы добавите конструктор, вы сможете инициализировать свои поля.

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