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 Actuator Prometheus 指标中包含时间戳