Бесконечная рекурсия, весенний клиент mvc висит - PullRequest
0 голосов
/ 07 января 2019

У меня проблема с методом записи в Spring. Когда я пытаюсь отправить объект в базу данных, клиентское приложение зависает, и мне нужно прекратить его. Размещение объекта с помощью curl работает нормально. Я получаю журнал:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: java.util.ArrayList[0]->dareq.Point["points"]->java.util.ArrayList[0]->dareq.Point["points"]->java.util.ArrayList[0]->dareq.Point["points"]->java.util.ArrayList[0]->dareq.Point["points"]

Клиентская сторона:

Класс балла:

@JsonIgnoreProperties(ignoreUnknown=true)
public class Point {
private Long id;
private List<String> bssid = new ArrayList<>();
private List<Double> rssi = new ArrayList<>();
private double x;
private double y;

public Point()
{

}

public Point(Long id, List<String> bssid, List<Double> rssi, double x, double y){
    this.id = id;
    this.bssid = bssid;
    this.rssi = rssi;
    this.x = x;
    this.y = y;
}


public long getid(){
    return id;
}

public void setId(Long id) { this.id=id; }

public List<String> getbssid(){
    return bssid;
}

public void setbssid(List<String> bssid)
{
    this.bssid=bssid;
}

public List<Double> getrssi(){
    return rssi;
}

public void setrssi(List<Double> rssi)
{
    this.rssi=rssi;
}

public Double getx(){
    return x;
}

public void setx(Double x){
    this.x=x;
}

public Double gety(){
    return y;
}

public void sety(Double y){
    this.y=y;
}

public List<Point> getPoints()
{
    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<List<Point>> pointResponse = restTemplate.exchange("http://naviserv-env-1.4jdgmueexz.us-east-2.elasticbeanstalk.com/points/", HttpMethod.GET, null,
            new ParameterizedTypeReference<List<Point>>()
            {});
    List<Point> points = pointResponse.getBody();
    return (points);
}

public Point getPoint(long id)
{
    RestTemplate restTemplate = new RestTemplate();
    Point point = restTemplate.getForObject("http://naviserv-env-1.4jdgmueexz.us-east-2.elasticbeanstalk.com/points/" + id, Point.class);
    return point;
}

public void postPoint()
{
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.postForObject("http://naviserv-env-1.4jdgmueexz.us-east-2.elasticbeanstalk.com/points", this, this.getClass());
}

public void deletePoint(Long id)
{
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.delete("http://localhost:5000/points/" + id);
}

@Override
public String toString() {
    return "Point{" +
            "id='" + id + '\'' + ", " +
            "bssid='" + bssid + '\'' + ", " +
            "rssi='" + rssi + '\'' + ", " +
            "x='" + x + '\'' + ", " +
            "y='" + y + '\'' +
            '}';
}

}

Сторона сервера:

Контроллер:

@PostMapping("/points")
Points newPoints(@RequestBody Points newPoints){
return repository.save(newPoints);
}

Класс очков:

@Data
@Entity
public class Points {

    private @Id @GeneratedValue Long id;
    @Column
    @ElementCollection
    private List<String> bssid;
    @Column
    @ElementCollection
    private List<Double> rssi;
    private double x;
    private double y;

Points (){
};

Points(List<String> bssid, List<Double> rssi, double x, double y){
    this.bssid=bssid;
    this.rssi=rssi;
    this.x=x;
    this.y=y;
}
}

Проверка журналов на сервере AWS, когда я пытаюсь разместить объект на клиенте, вызываются многие методы get:

78.28.26.200 - - [07/Jan/2019:00:34:31 +0000] "GET /points/ HTTP/1.1" 200 87 "-" "Java/1.8.0_172" "-"
78.28.26.200 - - [07/Jan/2019:00:34:32 +0000] "GET /points/ HTTP/1.1" 200 87 "-" "Java/1.8.0_172" "-"
78.28.26.200 - - [07/Jan/2019:00:34:32 +0000] "GET /points/ HTTP/1.1" 200 87 "-" "Java/1.8.0_172" "-"
78.28.26.200 - - [07/Jan/2019:00:34:32 +0000] "GET /points/ HTTP/1.1" 200 87 "-" "Java/1.8.0_172" "-"
78.28.26.200 - - [07/Jan/2019:00:34:32 +0000] "GET /points/ HTTP/1.1" 200 87 "-" "Java/1.8.0_172" "-"

Я буду очень признателен за любую помощь. Спасибо

1 Ответ

0 голосов
/ 07 января 2019

Джексон интерпретирует метод public List<Point> getPoints() как метод получения свойства points и вызывает его, чтобы получить значение, отсюда и бесконечная ошибка рекурсии.

Решение

Поместите @JsonIgnore в public List<Point> getPoints() (еще лучше, для всех методов, отличных от получателя) или переименуйте его, скажем, в public List<Point> points().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...