Здесь я пытаюсь получить настраиваемый ответ от 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);
}}
Похоже, вы пытаетесь отправить 200 ответов ОК, даже если у вас есть ошибка. Не надо. Просто отправьте данные обратно, и, если вам нужно сообщить об ошибке, выбросить исключение и аннотировать его (или использовать ControllerAdvice), чтобы он сгенерировал ответ об ошибке с правильным кодом состояния ошибки.
@NickRussler я проверю
@JBNizet на самом деле это не полный код, и в отношении исключения да, у меня есть ConstrollerAdvise, вопрос в том, как получить настраиваемый ответ, если найденные данные либо нашли массив, либо объект, но мне нужно использовать то же имя атрибута, что показано с @JsonProperty(value = "data")

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