我有一个POST
请求的列表,其中请求正文非常相似
{
"entity":{
"type":"Nissan"
"parts":{
"Nissan_unique_content1":"value",
"Nissan_unique_content2":"value"
}
}
"updateDate":"Date..."
}
{
"entity":{
"type":"Ford"
"parts":{
"Ford_unique_content1":"value",
"Ford_unique_content2":"value",
"Ford_unique_content3":"value"
}
}
"updateDate":"Date..."
}
我有一个通用的RequestBody
public class RequestBody<T>{
EntityBody<T> entity;
Date updateDate;
}
public class EntityBody<T>{
String type;
T parts;
}
在我的帖子Controller
中,我有方法
@RequestMapping(value = "/{type}")
public ResponseEntity<?> create(
@PathVariable(value = "type") String type,
@RequestBody RequestBody<T> body) {
...
}
总而言之,是否可以根据类型分配通用类型T
?
在这种情况下,我不需要创建多个创建方法,否则我需要创建多个方法,例如
@RequestMapping(value = "/nissan")
public ResponseEntity<?> createNissan(
@RequestBody RequestBody<NissanContent> body) {
...
}
@RequestMapping(value = "/ford")
public ResponseEntity<?> createFord(
@RequestBody RequestBody<Ford> body) {
...
}
这是不必要的重复。
答案 0 :(得分:0)
这可以通过使用-f
注释来完成。
例如:
根据“ parts”键下的不同结构定义实体:
@JsonTypeInfo
在class NissanParams {
@JsonProperty("Nissan_unique_content1")
private String nissanUniqueContent1;
@JsonProperty("Nissan_unique_content2")
private String nissanUniqueContent2;
// getters + setters
}
中,删除EntityBody
字段并添加注释:
type
将有一个单一的控制器方法:
public class EntityBody<T> {
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes({ @JsonSubTypes.Type(value = NissanParams.class, name = "Nissan")})
private T parts;
}
答案 1 :(得分:0)
您可以使用JsonTypeInfo
和JsonSubTypes
Jackson
批注。您的模型可能如下所示:
class EntityBody {
private Car parts;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", include = JsonTypeInfo.As.EXTERNAL_PROPERTY)
@JsonSubTypes({
@JsonSubTypes.Type(name = "Ford", value = Ford.class),
@JsonSubTypes.Type(name = "Nissan", value = Nissan.class)
})
public Car getParts() {
return parts;
}
}
如您所见,您不需要type
属性。 Jackson
将读取它以查找汽车类型。我已经创建了Car
基类/接口,但是您不需要这样做。
您的POST
方法可能如下所示:
@RequestMapping(value = "/cars", method = RequestMethod.POST)
public ResponseEntity<?> create(@RequestBody RequestPayload body) {
logger.info(body.toString());
return ResponseEntity.ok("OK");
}
您在这里不需要PathVariable
。