Spring Boot在JSON中包含ID字段

时间:2018-07-31 14:00:22

标签: json spring spring-boot kotlin jackson

我正在使用spring-boot-starter-web,并且我想使用总线的sideNumber作为Id的值,并以JSON响应返回此值。

可能很简单,但是我发现的所有内容都与Spring Data Rest有关。

这是我的实体:

@Entity
@Table(name = "buses")
class Bus(
        @Id
        @JsonProperty("sideNumber")
        @JsonInclude
        private val sideNumber: Int,
        @NotBlank
        var longitude: Double,
        @NotBlank
        var latitude: Double
)

我尝试用sideNumber(Id)@JsonInclude来注释@Jsonproperty属性,但是没有运气。在我的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>()
}
}

要将此sideNumber(id)属性包含到JSON响应中,我该怎么办?

2 个答案:

答案 0 :(得分:1)

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

更复杂的方法是创建一个ObjectMapper类型的@Bean并配置Jackson来序列化私有成员,如下所述:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper

答案 1 :(得分:-1)

我希望您必须扩展RepositoryRestConfigurerAdapter并覆盖configureRepositoryRestConfiguration方法。 如果是,则在暴露对象名称中设置实体类名称。 这样会在json中添加显示ID列。