Пользовательский ResponseEntity @RestController - Джексон

Здесь я пытаюсь получить настраиваемый ответ от RequestMapping, ниже представлена ​​структура json, которую я пытаюсь получить в случае массива объектов:

{
    "error": false,
    "message": "the message",
    "data": [{},{},...]
}

и ниже в случае объекта

 {
        "error": false,
        "message": "the message",
        "data": {}
    }

Код работает нормально, но проблема в том, что «данные» не всегда имеют массив, они могут хранить объект, поэтому я попытался создать собственный класс POJO, который содержит мой собственный ответ, и когда я хочу аннотировать два атрибута с помощью то же имя, я получаю ошибку ниже

Could not find acceptable representation

А что, если я создам другой класс, который будет содержать те же атрибуты, но с JsonObject, а не с массивом, есть ли лучший способ добиться этого?

Ниже представлены мои занятия:

    @JsonInclude(Include.NON_NULL)
public class JsonResponseObject<T> implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    private boolean error;
    private String message ;
    @JsonProperty(value = "data")
    private ArrayList<T> array;
    @JsonProperty(value = "data")
    private Object object ;


    public JsonResponseObject() {

    }


    public boolean isError() {
        return error;
    }


    public void setError(boolean error) {
        this.error = error;
    }


    public String getMessage() {
        return message;
    }


    public void setMessage(String message) {
        this.message = message;
    }


    public ArrayList<T> getArray() {
        return array;
    }


    public void setArray(ArrayList<T> array) {
        this.array = array;
    }


    public Object getObject() {
        return object;
    }


    public void setObject(Object object) {
        this.object = object;
    }

}

UserJsonController.java:

@RestController()
@RequestMapping(value = "/json")
public class UserJsonController {

@Autowired
private UserRepository userDAO;

@RequestMapping(value = "/users", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> getUsers() {

    ArrayList<Users> entityList = (ArrayList<Users>) userDAO.findAll();

    JsonResponseObject<Users> jsonResponse = new JsonResponseObject<Users>();
    jsonResponse.setError(false);
    jsonResponse.setMessage("test"); 
    jsonResponse.setArray(entityList);
    return new ResponseEntity<>(jsonResponse, HttpStatus.OK);

}

@RequestMapping(value = "/users/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> getUserByID(@PathVariable int id) {

    JsonResponseObject<Users> jsonResponse = new JsonResponseObject<Users>();
    jsonResponse.setError(false);
    jsonResponse.setMessage("test");
    jsonResponse.setObject(userDAO.findById(id).get());
    return new ResponseEntity<>(jsonResponse, HttpStatus.OK);

}}

Возможно, вы можете использовать способность Джексона полиморфной десериализации в сочетании с перезаписанными ковариантными типами возврата: github.com/FasterXML/jackson-docs/wiki/…

Nick Russler 03.06.2018 00:44

Похоже, вы пытаетесь отправить 200 ответов ОК, даже если у вас есть ошибка. Не надо. Просто отправьте данные обратно, и, если вам нужно сообщить об ошибке, выбросить исключение и аннотировать его (или использовать ControllerAdvice), чтобы он сгенерировал ответ об ошибке с правильным кодом состояния ошибки.

JB Nizet 03.06.2018 10:05

@NickRussler я проверю

Ahmad Alkhatib 03.06.2018 13:35

@JBNizet на самом деле это не полный код, и в отношении исключения да, у меня есть ConstrollerAdvise, вопрос в том, как получить настраиваемый ответ, если найденные данные либо нашли массив, либо объект, но мне нужно использовать то же имя атрибута, что показано с @JsonProperty(value = "data")

Ahmad Alkhatib 03.06.2018 13:38
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
4
72
0

Другие вопросы по теме