2016-06-21 137 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); 
}