如何在自定义Spring Data Rest控制器中正确处理POST?

时间:2016-10-14 18:26:05

标签: java spring spring-data-rest

在我的Spring Data Rest应用程序中,我有一个标准存储库:

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {

        List<Person> findByLastName(@Param("name") String name);

}

我还有一个自定义控制器,它将在HTTP POST上实现一些额外的逻辑:

@RestController
@RequestMapping("/people")
public class PersonController {
    @RequestMapping(value = "/**", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> savePerson(@RequestBody Person person, UriComponentsBuilder b, @RequestParam Map<String, ?> id) {


        UriComponents uriComponents = 
                b.path("/people/").buildAndExpand();
        HttpHeaders responseHeaders = new HttpHeaders();
           responseHeaders.setLocation(uriComponents.toUri());
           responseHeaders.set("MyResponseHeader", "MyValue");
        return new ResponseEntity<String>("Hello World\n\n", responseHeaders, HttpStatus.CREATED);
    }
}

在此控制器中保存“Person”实体的正确方法是什么,因为我没有明确使用Hibernate Entity Manager? “person”参数只是一个POJO,因此它没有任何持久性CRUD方法。

1 个答案:

答案 0 :(得分:1)

如果PersonRepository中使用的Person类与您在控制器中使用的任何映射RequestBody的相同,那么在控制器方法中你可以只做personRepository.save(person) - 假设personRepository是一个Autowired实例PersonRepository类。

我猜你正在试验spring data rest https://spring.io/guides/gs/accessing-data-rest/。如果是这种情况,您的类路径中可能有内存数据库com.h2database:h2。这就是为什么,在给定的示例中,一切都只是工作,你甚至没有配置数据库或添加任何JPA注释到你的人类。因此,您仍然可以从自定义控制器中执行personRepository.save(person),而不会在Person类中使用任何JPA注释。