实现/覆盖MongoRepository保持HATEOAS格式

时间:2014-10-17 03:15:34

标签: spring mongodb spring-data-rest hateoas spring-hateoas

我有一个简单的MongoRepository我想修改以在post(save())上返回生成的ObjectId。

public interface EmployeeRepository extends MongoRepository<Employee, String>
{   
    public void delete(Employee employee);
    public Employee save(Employee employee);
    public Employee findOne(String id);
    public List<Employee> findAll();
    public Employee findByName(String principal);
}

我已经探索了生成id客户端的方法并在帖子中传递但是我真的希望Spring能够处理它。

我尝试拦截控制器并在ResponseBody中返回对象,如下所示:

@RequestMapping(value=URI_EMPLOYEES, method=RequestMethod.POST)
public @ResponseBody Employee addEmployee(@RequestBody Employee employee) {
    return repo.save(employee);
}

问题是它迫使我为我重新处理所有HATEOAS相关逻辑Spring句柄。这是一个主要的痛苦。 (除非我错过了什么。)

在不必替换所有方法的情况下,最有效的方法是什么?

2 个答案:

答案 0 :(得分:1)

使用 @Controller 代替 @RepositoryRestController ,这导致事情发生了变化。

我们现在可以轻松地覆盖此资源上的POST方法,以便在保持spring-data-rest的EmployeeRepository实现完整的同时返回我们想要的任何内容。

@RepositoryRestController
public class EmployeeController {

    private final static String URI_EMPLOYEES = "/employees";

    @Autowired private EmployeeRepository repo;

    @RequestMapping(value=URI_EMPLOYEES, method=RequestMethod.POST)
    public @ResponseBody HttpEntity<Employee> addVideo(@RequestBody Employee employee) {
        return new ResponseEntity<Employee>(repo.save(employee), HttpStatus.OK);
    }
}

答案 1 :(得分:-1)

看一下界面:

public Employee save(Employee employee)

您只需执行

即可获取已保存的实体
Employee saved = repository.save(employee);
return saved.getId();

据说,您肯定可以生成ID并通过setId()进行设置。但是一旦保存了ID,它就是不可变的。更改Id并保存该实体将导致在MongoDB中保存新文档。