Spring REST模糊方法

时间:2015-02-16 10:04:14

标签: java spring rest spring-mvc

我需要一个弹簧支架控制器来插入数据。这就是我已经得到的:

@RestController
@Transactional
public abstract class AbstractRESTController<E extends Identifiable<P>, P extends Serializable> {

    @RequestMapping(method = RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(HttpStatus.CREATED)
    public void create(@RequestBody final E entity) {
        service.create(entity);
    }
}

所以我可以在http://mycontext/插入一个实体 我现在需要的是一种接受相同路径的实体列表的方法。基本上这个:

@RequestMapping(method = RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.CREATED)
public void createAll(@RequestBody final List<E> entities) {
    for (E entity : entities) {
        service.create(entity);
    }
}

那么我怎样才能让Spring知道我发送数组而不是单个实体然后使用其他功能呢? 我的错误:

Caused by: java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'sfusersRESTController' bean method 
public void AbstractRESTController.createAll(java.util.List<E>)
to {[/sfusers],methods=[POST],params=[],headers=[],consumes=[application/json],produces=[],custom=[]}: There is already 'sfusersRESTController' bean method
public void AbstractRESTController.create(E) mapped.

2 个答案:

答案 0 :(得分:1)

如果要将多个请求映射到给定路径,则必须使用不同的HTTP方法;例如。 POST,PUT。

在您的情况下,我会使URL不同;即one / mycontext / as-entity和/ mycontext / as-list。

或者您必须具有相同的URL - 它必须能够处理各种请求主体。所以你可以有一个RequestMapping(),它需要一个Object - 然后处理该对象 - 作为实体或列表。

就个人而言,我仍然更喜欢不同的RequestMapping路径。

答案 1 :(得分:1)

定义不同的请求映射路径,以便它可以使用

进行相应的回调
@RequestMapping(value = "")

现在您的休息控制器将如下所示:

@RestController
@Transactional
public abstract class AbstractRESTController<E extends Identifiable<P>, P extends Serializable> {

    @RequestMapping(value = "create", method = RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(HttpStatus.CREATED)
    public void create(@RequestBody final E entity) {
        service.create(entity);
    }

    @RequestMapping(value = "createAll", method = RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(HttpStatus.CREATED)
    public void createAll(@RequestBody final List<E> entities) {
        for (E entity : entities) {
            service.create(entity);
        }
    }
}