【问题标题】:Spring Boot include ID field in jsonSpring Boot 在 json 中包含 ID 字段
【发布时间】: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 响应中?

【问题讨论】:

    标签: json spring spring-boot kotlin jackson


    【解决方案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

    【讨论】:

    • 天哪,我还没有注意到这个私有修饰符... :( 这个字段不必是私有的。感谢您的敏锐洞察力。多么愚蠢的错误...
    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2021-01-07
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多