Skip to main content
 首页 » 编程设计

json之Spring Boot 在 json 中包含 ID 字段

2025年02月15日24exmyth

我正在使用 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 响应中,我只获得经度和纬度。

我的 Controller 看起来像这样:

@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 响应中?

请您参考如下方法:

通过将成员属性声明为私有(private),您告诉 Kotlin 不要为其生成 getter。
SpringBoot使用的Jackson,使用getters来序列化对象。
这就是它看不到您的属性(property)的原因。如果它没有看到该属性,它也不会获得注释。
解决它的最简单方法是将其保留为 val,但不要将其设为私有(private):val sideNumber: Int

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