2016-08-10 8 views
0

두 컨트롤러 (클래스)가 있습니다. 그들 중 하나에서 나는 요청을하고 결과 데이터를 다른 컨트롤러로 전송하고 싶습니다. 하지만 여하튼 빈 목록 만 반환합니다.컨트롤러에서 데이터를 가져 오는 방법은 무엇입니까?

package controllers; 

import com.querydsl.core.Tuple; 
import com.querydsl.jpa.impl.JPAQueryFactory; 
import models.*; 
import play.db.jpa.JPAApi; 
import play.db.jpa.Transactional; 
import play.mvc.Controller; 
import play.mvc.Result; 

import javax.inject.Inject; 
import javax.persistence.EntityManager; 
import java.time.LocalDate; 
import java.util.ArrayList; 
import java.util.List; 

import static java.util.Collections.addAll; 

public class TestingController extends Controller { 



    private JPAApi jpaApi; 
    @Inject 
    public TestingController(JPAApi jpaApi) { 
     this.jpaApi = jpaApi; 
    } 

    private static ArrayList<ArrayList<Object>> listOfLists = new ArrayList<>(); 

    @Transactional 
    public Result resolving_requests() { 
     QClaim claim = QClaim.claim; 
     QFinancialClaimData financialClaimData = QFinancialClaimData.financialClaimData; 
     QDate_diff date_diff=QDate_diff.date_diff; 
     EntityManager em=jpaApi.em(); 
     JPAQueryFactory queryFactory = new JPAQueryFactory(em); 

     //QUERY1: Costs and amounts of different claims for the last year 
     String columns[] = {"Month, Year", "Type of risk", "Risks count", "Risks amount"}; 
     List<Tuple> q1=queryFactory.select(claim.typeOfRisk, financialClaimData.overAllAmount.sum(), claim.claimDate_finish.count(), claim.claimDate_start.month(), claim.claimDate_start.year()) 
       .from(claim) 
       .where(claim.claimDate_start.year().gt(LocalDate.now().getYear()-2).and(claim.claimDate_start.month().gt(LocalDate.now().getMonthValue())).or(claim.claimDate_start.year().eq(LocalDate.now().getYear()))) 
       .groupBy(claim.typeOfRisk, claim.claimDate_start.month(), claim.claimDate_start.year()) 
       .orderBy(claim.claimDate_start.year().asc(), claim.claimDate_start.month().asc(), claim.typeOfRisk.asc()) 
       .fetch(); 
     ArrayList<Object> singleList = new ArrayList<>(); 
     addAll(singleList, columns); //Adding all columns' names to the first row, simailar to foreach 
     this.listOfLists.add(singleList); 
     for (Tuple l: q1){ 
      singleList = new ArrayList<>(); 
      singleList.add(l.get(claim.claimDate_start.month()).toString() + "/" + l.get(claim.claimDate_start.year()).toString()); 
      singleList.add(l.get(claim.typeOfRisk)); 
      singleList.add(l.get(claim.claimDate_finish.count())); 
      singleList.add(l.get(financialClaimData.overAllAmount.sum())); 
      this.listOfLists.add(singleList); 
     } 

     System.out.println(listOfLists); 
     for (List i: listOfLists){ 
      for (Object i_inner: i){ 
       System.out.print(i_inner+"|"); //That works fine and I see a result 
      } 
      System.out.print("\n"); 
     } 
     return ok("Your new application is ready."); 
    } 

    public static ArrayList<ArrayList<Object>> get_arr_list() { 
     return listOfLists; //Probably that returns empty list 
    } 
} 

제 2 제어부, 즉 ArrayList를 수신한다 : 요청하는 데이터 전송 우선 컨트롤러 패키지 컨트롤러;

import com.fasterxml.jackson.databind.JsonNode; 
import play.mvc.*; 
import java.util.ArrayList; 


public class ReportsController extends Controller { 

    public Result generating_reports(){ 
       ArrayList<ArrayList<Object>> listOfLists = TestingController.get_arr_list(); 
       System.out.println("Here should be a list: "+listOfLists); //This returns an empty list [] 

     return ok("All is ready!"); 
    } 
} 

어떻게 해결할 수 있습니까?

+1

문제를 설명하는 데 필요한 최소 [MCVE]는 어떨까요? – c0der

+1

@Bogdan'resolveing_requests()'가 http 요청이나 혼자서 호출에 의해 실행되지 않는다면 그리스트는 비어있을 것입니다 ... 또한 정적 ArrayList는 동시 설정에서 많은 문제를 줄 것입니다 ... – Salem

+0

@Salem 어떻게 실행할 수 있습니까? –

답변

1

먼저 문제를 나타내는 최소한의 실행 가능한 코드를 게시하는 것이 중요합니다. 이것은 필수적이지 않은 ALL을 제거하는 것을 의미하며 코드를 컴파일하고 실행하는 데 필요한 모든 것을 포함합니다. 다음은 예입니다 (설명 참조).

import static java.util.Collections.addAll; 
import java.util.ArrayList; 

public class TestingController { 

    private static ArrayList<ArrayList<Object>> listOfLists = new ArrayList<>(); 

    //in the code you posted this method never gets executed 
    public void resolving_requests() { 

     String columns[] = {"Month, Year", "Type of risk", "Risks count", "Risks amount"}; 

     ArrayList<Object> singleList = new ArrayList<>(); 
     addAll(singleList, columns); //Adding all columns' names to the first row, simailar to foreach 

     listOfLists.add(singleList); 
    } 

    public static ArrayList<ArrayList<Object>> get_arr_list() { 
     return listOfLists; //Probably that returns empty list 
    } 

    public static void main(String args[]) { 

     //this will print an empty list because resolving_requests was not executed 
     System.out.println("listOfLists "+ TestingController.get_arr_list()) ; 

     //execute resolving_requests 
     new TestingController().resolving_requests(); 

     //now array list is not empty 
     System.out.println("listOfLists "+ TestingController.get_arr_list()) ; 
    } 
} 
+0

감사! 그게 효과가있어! JPAApi 변수 만 사용 : '새 TestingController (jpaApi) .resolving_requests(); System.out.println ("listOfLists"+ TestingController.get_arr_list()); ' 이미 TestingController에서 선언 했음에도 불구하고 ...이 요구 사항을 어떻게 처리 할 수 ​​있습니까? –

+0

코드에 JPAApi가 포함되어 있지 않지만 가능한 문제점을 보여줍니다. MINIMAL을 사용하면 문제를 식별하는 데 도움이됩니다. 실행 파일을 가져 오면 다른 사람들이 당신을 도우며 다른 사람의 시간을 존중하는 데 도움이됩니다. – c0der

+0

나는 당신을 쫓을 지 모르겠다. 그러나 컨트롤러 테스트에 대한 참고 사항을 유지하고 싶을 것이다.'TestingController tc = TestingController (jpaApi); 필요할 때마다 사용하십시오 :'tc.get_arr_list();' – c0der

관련 문제