2016-06-21 92 views
0

我有方法「更新」從CRUD控制器:如何映射到存在對象?

@PutMapping(value = "/{id}") 
public ResponseEntity<?> update(
     @PathVariable("id") Long id, 
     @RequestBody Entity entity 
) { 
    repository.saveAndFlush(entity); 
    return ResponseEntity.ok(entity); 
} 

這是代碼創建實體的新實例。 如何將RequestBody映射到現有實體?例如:

public ResponseEntity<?> update(
     @RequestBody @LoadById(@PathVariable("id")) Entity entity 
) 

謝謝。

+0

你不爲PUT和POST應該包含需要(重新)的所有數據構建實體。如果不是這種情況,你將不得不編寫自己的HttpMessageConverter來啓用它。 –

+0

謝謝你的幫助。 –

回答

1

映射例如:

@RequestMapping(method = RequestMethod.PUT, value = "/{id}") 
public ResponseEntity<?> update(
     @PathVariable("id") Long id, 
     @Valid @RequestBody Entity entity 
) { 
    Entity oldEntity = repository.findOne(id); 

    AnnotatedClass annotatedClass = AnnotatedClass.construct(
      entity.getClass(), 
      objectMapper.getDeserializationConfig().getAnnotationIntrospector(), 
      new SimpleMixInResolver(null) 
    ); 

    Iterator<AnnotatedField> fields = annotatedClass.fields().iterator(); 
    while (fields.hasNext()) { 
     AnnotatedField field = fields.next(); 
     if (!objectMapper.getDeserializationConfig().getAnnotationIntrospector().hasIgnoreMarker(field)) { 
      field.fixAccess(); 
      field.setValue(oldEntity, field.getValue(entity)); 
     } 
    } 

    repository->save(oldEntity); 
    return ResponseEntity.ok(oldEntity); 
}