使用Spring-Data-JPA进行Spring启动:每次请求时都会填充ArrayList / JSON对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Spring-Data-JPA进行Spring启动:每次请求时都会填充ArrayList / JSON对象相关的知识,希望对你有一定的参考价值。

我在SpringBoot中创建这个REST API。我使用Spring-Data-JPA将我的对象Site与mysql数据库映射。 在Controller中,我设置了一个RequestMapping Annotation来从数据库中返回Site Object列表。控制器中的此方法从服务Bean调用另一个方法(getItinerary)。我已将服务的范围设置为“原型”(最初它设置为Singleton的默认值)。

问题是每次我点击链接(localhost:8080 / getItinerary)时返回的Json都会重新填充列表以及之前返回的数据。我想在每次点击链接时返回新的网站列表。

这是我的代码:

AlternateTravelPlan.java(我的服务Bean)

package...

import...



@Service
@Scope("prototype")
public class AlternateTravelPlan {

@Autowired
TravelPlanRepo travelPlanRepo;


ArrayList<Site> siteList = new ArrayList<>;

public List<Site> getItinerary() {


    //Enhance For Loop to fetch Site List from Database
    for (Site site : travelPlanRepo.findAll()) {
        siteList.add(site);
    }
    return siteList;
}
}

travel plan repo.Java

package...
import...

import java.util.List;

@Repository
public interface TravelPlanRepo extends JpaRepository<Site, Integer>{

}

itinerary controller.Java

import....

@RestController
public class ItineraryController{


@Autowired 
AlternateTravelPlan alternateTravelPlan;

@Autowired
TravelPlanRepo travelPlanRepo;

@RequestMapping("/getItinerary")
public List<Site> getItinerary(){
    return alternateTravelPlan.getItinerary();

}

}

我有另一个名为Site的POJO,它与数据库一起映射。我不是从这个类中提取代码,因为在这种情况下它是无关紧要的

答案

您的问题是您的siteList变量具有全局范围,因此每次调用getItinerary()时它都会向已经拥有的集合添加新项。您应该使siteList成为getItinerary方法中本地作用域的变量,每次调用该方法时清除它,或者每次调用该方法时创建一个新实例。例如。:

 package...

 import...



 @Service
 @Scope("prototype")
 public class AlternateTravelPlan {


 private TravelPlanRepo travelPlanRepo;

 //By autowiring constructors we avoid NPEs...
 @Autowired
 public AlternativeTravelPlan(TravelPlanRepo travelPlanRepo){
      this.travelPlanRepo = travelPlanRepo;
 }

 public List<Site> getItinerary() {

      List siteList = new ArrayList();
      //Enhance For Loop to fetch Site List from Database
      for (Site site : travelPlanRepo.findAll()) {
           siteList.add(site);
      }
      return siteList;
}
}

以上是关于使用Spring-Data-JPA进行Spring启动:每次请求时都会填充ArrayList / JSON对象的主要内容,如果未能解决你的问题,请参考以下文章

纯干货,Spring-data-jpa详解(转)

使用 spring-data-jpa 和 spring-mvc 过滤数据库行

Spring-data-jpa详解

Spring-data-jpa详解,全方位介绍。

Spring-data-jpa详解,全方位介绍。

纯干货,Spring-data-jpa详解,全方位介绍