为相同的休止端点提供两种方法,但在Spring中的PathVariable中有所不同

时间:2018-05-23 12:18:12

标签: java json rest spring-mvc spring-boot

我有一个要求,我需要根据路径变量将请求主体映射到特定的子类。请求正文本身不包含任何关于选择哪个子类的信息。

@ApiOperation(value = "Update Developer (dev)",
        response = ResponseEntity.class)
@RequestMapping(method = RequestMethod.PATCH,
        value = "/{type}")
public ResponseEntity<Response> updateDeveloper(
        @PathVariable String type,
        @RequestParam("year") String year,
        @RequestBody Developer employeeUpdate,

) { .....}


@ApiOperation(value = "Update Manager (manager)",
        response = ResponseEntity.class)
@RequestMapping(method = RequestMethod.PATCH,
        value = "/{type}")
public ResponseEntity<Response> updateManager(
        @PathVariable String type,
        @RequestParam("year") String year,
        @RequestBody Manager employeeUpdate,

) { .....}

Developer and Manager扩展抽象类Employee。

我试过只有一种方法如下:

@ApiOperation(value = "Update Employee (manager, dev)",
        response = ResponseEntity.class)
@RequestMapping(method = RequestMethod.PATCH,
        value = "/{type}")
public ResponseEntity<Response> updateEmployee(
        @PathVariable String type,
        @RequestParam("year") String year,
        @RequestBody Employee employeeUpdate,

) { .....}

但是spring无法将Employee实例实例化为它的摘要。

我的设计不正确吗?我更喜欢有一个不需要修改Employee / Developer / Manager类的解决方案。

提前致谢!!

2 个答案:

答案 0 :(得分:0)

通过REST合规性,您应该确定您的资源:

@RequestMapping(method = RequestMethod.PATCH, value = "/developer")

@RequestMapping(method = RequestMethod.PATCH, value = "/manager")

如果你仍然想要随机发布一个主体(开发人员或经理),你是经理和开发人员的组合DTO:

public class EmployeeDTO {
    private int type; // Developer or manager
    // All of properties of Manager and Developer
}

通过检查type,您可以委派正确的服务方法。

答案 1 :(得分:0)

谢谢大家对此进行调查。我找到了一种适合我情况的方法:

{{1}}

有了这个,我也不会得到任何实例化错误,当尝试将单个方法和请求体的数据类型设置为父类时。