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