Spring引导包含json中的ID字段

Spring引导包含json中的ID字段,json,spring,spring-boot,kotlin,jackson,Json,Spring,Spring Boot,Kotlin,Jackson,我正在使用springbootstarterweb,我想使用总线的sideNumber作为Id值,并以JSON格式返回该值 可能很简单,但我发现的一切都与Spring数据Rest有关 这是我的实体分类: @Entity @Table(name = "buses") class Bus( @Id @JsonProperty("sideNumber") @JsonInclude private val sideNumber: Int,

我正在使用
springbootstarterweb
,我想使用总线的
sideNumber
作为
Id
值,并以JSON格式返回该值

可能很简单,但我发现的一切都与Spring数据Rest有关

这是我的实体分类:

@Entity
@Table(name = "buses")
class Bus(
        @Id
        @JsonProperty("sideNumber")
        @JsonInclude
        private val sideNumber: Int,
        @NotBlank
        var longitude: Double,
        @NotBlank
        var latitude: Double
)
我试图用
@JsonInclude
@Jsonproperty
注释
侧号(Id)
属性,但没有成功。在JSON响应中,我只得到经度和纬度

我的控制器如下所示:

@RestController
@RequestMapping("/api")
class BusController {

@Autowired
private lateinit var busRepository: BusRepository

@GetMapping("/buses")
fun getAllBuses(): List<Bus> {
    return busRepository.findAll()
}

@PostMapping("/buses")
fun createBus(@Valid @RequestBody bus: Bus): Bus {
    return busRepository.save(bus)
}

@GetMapping("/buses/{sideNumber}")
fun getBusById(@PathVariable(value = "sideNumber") sideNumber: Long): Bus {
    return busRepository.findById(sideNumber)
            .orElseThrow { ResourceNotFoundException("Bus", "sideNumber", sideNumber) }
}

@PutMapping("/buses/{sideNumber}")
fun updateBus(@PathVariable(value = "sideNumber") sideNumber: Long,
               @Valid @RequestBody newBus: Bus): Bus {

    val bus = busRepository.findById(sideNumber)
            .orElseThrow { ResourceNotFoundException("Bus", "sideNumber", sideNumber) }

    bus.latitude = newBus.latitude
    bus.longitude = newBus.longitude

    return busRepository.save(bus)
}

@DeleteMapping("/buses/{sideNumber}")
fun deleteBus(@PathVariable(value = "sideNumber") sideNumber: Long): ResponseEntity<*> {
    val bus = busRepository.findById(sideNumber)
            .orElseThrow { ResourceNotFoundException("Bus", "sideNumber", sideNumber) }

    busRepository.delete(bus)

    return ResponseEntity.ok().build<Any>()
}
}
@RestController
@请求映射(“/api”)
类总线控制器{
@自动连线
私有lateinit var busRepository:busRepository
@GetMapping(“/bus”)
fun getallbus():列表{
返回busRepository.findAll()
}
@后映射(“/总线”)
fun createBus(@Valid@RequestBody-bus:bus):总线{
返回busRepository.save(总线)
}
@GetMapping(“/bus/{sideNumber}”)
fun getBusById(@PathVariable(value=“sideNumber”)sideNumber:Long):总线{
返回busRepository.findById(sideNumber)
.orelsetrow{ResourceNotFoundException(“总线”,“侧号”,侧号)}
}
@PutMapping(“/bus/{sideNumber}”)
fun updateBus(@PathVariable(value=“sideNumber”)sideNumber:Long,
@有效@RequestBody newBus:Bus):总线{
val bus=busRepository.findById(sideNumber)
.orelsetrow{ResourceNotFoundException(“总线”,“侧号”,侧号)}
bus.LATIONE=NEBUS.LATIONE
bus.longitude=newBus.longitude
返回busRepository.save(总线)
}
@DeleteMapping(“/bus/{sideNumber}”)
fun deleteBus(@PathVariable(value=“sideNumber”)sideNumber:Long):ResponseEntity{
val bus=busRepository.findById(sideNumber)
.orelsetrow{ResourceNotFoundException(“总线”,“侧号”,侧号)}
busRepository.delete(总线)
返回ResponseEntity.ok().build()
}
}

要将此
sideNumber(id)
属性包含到JSON响应中,我必须做些什么?

通过声明成员属性private,您告诉Kotlin不要为其生成getter。
SpringBoot使用的Jackson使用getter序列化对象。
这就是为什么它看不到你的财产。如果没有看到属性,也不会得到注释。
解决此问题的最简单方法是将其保留为
val
,但不要将其设置为私有:
val sideNumber:Int


更复杂的方法是创建ObjectMapper类型的@Bean,并将Jackson配置为同时序列化私有成员,如下所述:

ooman我没有注意到这个私有修饰符…:(这个领域不必是私人的。谢谢你的敏锐洞察力。多么愚蠢的错误。。。