RestController JSON Формат объекта ответа - PullRequest
0 голосов
/ 04 марта 2020

Я использую Spring Boot для возврата данных из репозитория. Я хотел бы отформатировать мой JSON, чтобы он хорошо работал с обработкой Ext JS 'ajax. По сути, я хотел бы включить свойства для обработки success / fail, count и errorMsg вместе со списком данных из репозитория.

Я попытался создать объект ResponseDTO, который я возвращаю из моего Rest Controller .

@RestController
public class AdminController {

    private static final Logger logger = LogManager.getLogger(AdminController.class);

    @Autowired
    private UserService userService;

    @Autowired
    private SecurityService securityService;

    @Autowired
    private UserValidator userValidator;

    @GetMapping("/searchUsers")
    public ResponseDTO searchUsers(String name, String active) {
        int activeFlag;
        List<User> users;
        ResponseDTO resp;
        if(active.equals("true")) {
            activeFlag = 1;
        } else activeFlag=0;

        if(StringUtils.isEmpty(name)) {
            users= userService.findAllUsers(activeFlag);
        } else {
            users= userService.findByUsernameActive(name, activeFlag);
        }   

        return new ResponseDTO(users, true);
    }
}

Вот мой DTO, который я использую в контроллере:

public class ResponseDTO {
    private boolean success;
    private int count = 0;

    private List<?> values;

    public boolean getSuccess() {
        return this.success;
    }
    public void setState(boolean st) {
        this.success=st;
    }
    public int getCount() {
        return this.count;
    }
    public void setCount(int cnt) {
        this.count=cnt;
    }

    public List<?>getValues() {
        return this.values;
    }
    public void setValues(List<?> vals) {
        this.values = vals;
    }

    public ResponseDTO(List<?> items, boolean state) {
        this.success = state;
        values = items;
        this.count = items.size();
    }
}

Вот как выглядит JSON, который я получаю обратно:

{
  "ResponseDTO": {
                    "success":true,
                    "count":2,
                    "values":[{obj1 } , { obj2}]
                 }
}

то, что я хотел бы получить, это что-то вроде:

{
   "success" : true,
   "count" : 2,
   "values" [{obj1},{obj2}]
}

Я использую аннотации Spring Boot и Jackson. Я использовал аннотацию, чтобы игнорировать отдельные поля в объектах в массиве результатов, но я не могу найти способ развернуть объект ResponseDTO, чтобы не включать имя класса.

1 Ответ

1 голос
/ 04 марта 2020

Когда вы сериализуете ResponseDTO POJO, вы не должны получать «ResponseDTO» в ответе по умолчанию. Потому что функция обтекания root по умолчанию отключена. Смотрите do c здесь . Если у вас есть код ниже, пожалуйста, удалите его.

mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
...