2016-11-15 23 views
0

我的REST服务需要返回格式的消息:用杰克逊来包装子类属性到部分关键

{ 
    "code": 1000, 
    "message": "Success", 
    "description": null, 
    "data": [ 
    { 
     "custId": "00000023401443", 
     "engName": "MISTER NORWAYTEST'S PASSPORT", 
    } 
    ] 
} 

在JSON消息的第一层基本上是这样的消息头,可以提供有关技术细节消息传递,而“数据”键包含实际的商业信息。

如果我要创建一个类来反映这一点,我会在默认情况下出来的东西,看起来像这样:

public class ResponseModel<T> implements Serializable{ 
    private Integer code; 
    private String message; 
    private String description; 
    @JsonProperty(value = "data") 
    private T dataObj; 
} 

,但做这种方式引起我的控制器都返回与同一对象没有真正的商业环境中的价值类名和降低可读性:

@GetMapping("/profile/{userId}") 
public ResponseEntity<ResponseModel> getProfile(@PathVariable String userId) { 
... 
} 

我想要做的是使用ResponseModel作为超,然后将它们继承与实际的业务上下文名称的子类(如客户或账户) 。但为了坚持所需的JSON格式,我需要确保将子类的属性包装到“数据”键中。

有没有办法可以做到这一点?使用@JsonRootName也会包装超类属性。

回答

1

你你想要的格式的问题就在这里:

"data": *[* <---- HERE THAT BRACKET 

如果你想有一个支架,这意味着你的数据是一个列表,所以你需要通过使dataObj列表来解决这个问题:

@JsonProperty(value = "data") 
private List<T> dataObj; 

现在我没有看到子类ResponseModel的时候,你可能只是做到以下几点:

public ResponseEntity<ResponseModel> myControllerMethod(){ 
    List<Account> list = myService.readAccounts(); 
    return new ResponseModel<Account>(list);//default code OK,... 
} 

如果您让您的Business类继承ResponseModel,该类只是处理控制器结果的包装器,那么您将将业务层与控制器的特定层混合,这不是一个好主意。

,但做这种方式引起我的控制器都没有真正的商业环境中的价值类名称返回相同的对象,并降低可读性:

在Java的控制,你猜想有很少的线路,主要是调用一个服务,检查答案/处理异常,返回响应。所以我没有看到任何可读性问题,因为如果这样。如果您谈论通用返回值,只需正确命名您的方法。