Spring Boot 在 json 中包含 ID 字段

Posted

技术标签:

【中文标题】Spring Boot 在 json 中包含 ID 字段【英文标题】:Spring Boot include ID field in json 【发布时间】:2019-01-07 22:57:47 【问题描述】:

我正在使用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
)

我尝试用@JsonInclude@Jsonproperty 注释sideNumber(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>()


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

【问题讨论】:

【参考方案1】:

通过将成员属性声明为私有,您是在告诉 Kotlin 不要为其生成 getter。 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

【讨论】:

天哪,我还没有注意到这个私有修饰符... :( 这个字段不必是私有的。感谢您的敏锐洞察力。多么愚蠢的错误...

以上是关于Spring Boot 在 json 中包含 ID 字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 应用程序中包含 Spring Security

不能在 Spring Boot 2(版本 2.0.0.M7)中包含 Prometheus 指标

在 Spring Boot JAR 中包含外部文件

如何在 Spring Boot Actuator Prometheus 指标中包含时间戳

在开发期间使用 Gradle 在 Spring Boot 的 JAR 中包含 DevTools

Spring boot与Jackson ObjectMapper