Структура Java в пользовательских @ResponseBody

Я сопоставляю данные из базы данных с MyBatis на Java. Вот как я это делаю, и все работает очень хорошо:

final static String GET_CONFIGURATION = "select c.codigo, c.simbolo, c.fecha, c.moneda"
            + " from pps.cuenta c"
            + " where c.cuenta_id=#{accountId}";

@Select(GET_ACCOUNT_CONFIGURATION)
    @Results(value = { @Result(property = "code", javaType = String.class, column = "codigo"),
        @Result(property = "symbol", javaType = String.class, column = "simbolo"),
        @Result(property = "date", javaType = String.class, column = "fecha"),
        @Result(property = "currency", javaType = String.class, column = "moneda")})
    public Account getAccountConfiguration(@Param("accountId") final Integer accountId);

Вышеприведенное сопоставлено с объектом Account:

public class Account {

    private String code;    
    private String symbol;  
    private String date;    
    private String currency;    

    /** Getter ans Setter */
    ...

}

В контроллере, который я использую маппер через службу, получая параметр (accountId):

@RequestMapping(value = SecureApiResources.Account.URI_GET_ACCOUNTS_CONFIGURATION, method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody AccountConfiguration getAccountConfiguration(@PathVariable(value = "accountId") Integer accountId) {   

            Account account = accountService.getAccountConfiguration(accountId);
            ...
            return account;
}

Итак, когда я проверяю свой endpoint, я получаю этот ответ:

{
  "code": "COP",
  "symbol": "$"
  "date": "dd/MM/yyyy",
  "currency": "99.999,99"
}

Однако мне нужно эта структура:

{
  "currency": {
    "code": "COP",
    "symbol": "$"
  },
  "formats": {
    "date": "dd/MM/yyyy",
    "currency": "99.999,99"
  }
}

Я могу создать объект configuration, который содержит два других currency и formats, но это означает, что мне нужно создать эти объекты и назначить им соответствующие значения. Похоже, это не самый правильный путь.

0
задан 17.03.2016, 23:46
1 ответ

Используй инстанцию java.util.Map. А именно, для структуры, в которой ты нуждаешься, serГ - во что-то похожее в:

@SuppressWarnings("serial")
@RequestMapping(value = SecureApiResources.Account.URI_GET_ACCOUNTS_CONFIGURATION,
                method = RequestMethod.GET,
                produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<?> getAccountConfiguration(
        @PathVariable(value = "accountId") Integer accountId) {

    final Account account = accountService.getAccountConfiguration(accountId);

    ⋮

    return ResponseEntity.ok(new LinkedHashMap<String, Object>() {
        {
            put("currency", new LinkedHashMap<String, Object>() {
                {
                    put("code", account.getCode());
                    put("symbol", account.getSymbol());
                }
            });
            put("formats", new LinkedHashMap<String, Object>() {
                {
                    put("date", account.getDate());
                    put("currency", account.getCurrency());
                }
            });
        }
    });

}
1
ответ дан 24.11.2019, 14:43

Теги

Похожие вопросы