2016-06-04 3 views
0


이것은 바보 같은 질문 일 수 있지만 혼란 스러울뿐입니다. 개체가 생성 된 컨트롤러가 있습니다 & 다른 여러 컨트롤러에서 해당 개체를 사용하고 싶습니다.
현재 내 개체는 다른 사용자 요청이나 세션 요청이있을 때 덮어 쓰는 클래스 변수입니다. 좋지는 않다라고 확신합니다. & 일부 세션 문제가 발생합니다.다른 컨트롤러에있는 개체 사용

@Controller 
    public class DemoController 
    { 
     /* CURRENTLY THIS IS WHAT I'M DOING BUT I DON'T WANT THIS VARIABLE GLOBAL*/ 
     private MyCommonObject myCommonObject = new MyCommonObject(); 


     @RequestMapping(value="/demo-one", method=RequestMethod.POST) 
     public ModelAndView postControllerOne(@ModelAttribute SearchForm searchForm, 
       ModelMap modelMap) 
     { 
      //I want to use this object in all other controllers too 
      myCommonObject = someMethodToGetApiResult(searchForm); 

      SomeOtherObject someOtherObject = getSomeObject(myCommonObject); 
      modelMap.addAttribute("someOtherObject",someOtherObject); 

      return new ModelAndView("/firstJSP"); 
     } 

     @RequestMapping(value="/demo-two", method=RequestMethod.POST) 
     public ModelAndView postControllerTwo(@ModelAttribute SomeForm someForm, 
       ModelMap modelMap) 
     { 
      // Used the class variable here 
      SomeOtherObject someOtherObject = getSomeObject(myCommonObject,someForm); 

      modelMap.addAttribute("someOtherObject",someOtherObject); 
      return new ModelAndView("/secondJSP"); 
     } 

     @RequestMapping(value="/demo-three", method=RequestMethod.POST) 
     public ModelAndView postControllerThree(@ModelAttribute SomeForm someForm, 
       ModelMap modelMap) 
     { 
      // Used the class variable here 
      SomeOtherObject someOtherObject = getSomeObject(myCommonObject,someForm); 

      modelMap.addAttribute("someOtherObject",someOtherObject); 
      return new ModelAndView("/thirdJSP"); 
     } 

     @RequestMapping(value="/demo-four", method=RequestMethod.POST) 
     public ModelAndView postControllerFour(@ModelAttribute SomeForm someForm, 
       ModelMap modelMap) 
     { 
      // Used the class variable here 
      SomeOtherObject someOtherObject = getSomeObject(myCommonObject,someForm); 

      modelMap.addAttribute("someOtherObject",someOtherObject); 
      return new ModelAndView("/fourthJSP"); 
     } 
    } 


감사합니다 :의 아래 가정하자 나의 시나리오입니다.

+0

들여 쓰기를 수정하여 코드를 사람이 읽을 수있게 만들면 코드를 실제로 볼 수 있습니다. – Andreas

+0

@ Andreas 그랬습니까. 그 코드를 스택 에디터에 썼는데 IDE가 아니기 때문에 .. 솔루션을 얻으면 행복 할거야. – Yadvendra

답변

1

DemoController싱글 톤입니다. 모든 웹 요청에 하나의 인스턴스 이 있습니다..

즉, 전체 웹 응용 프로그램에 myCommonObject 값이 하나만 있음을 의미합니다. /demo-one 마지막 승리를 성공한 사람은 /demo-two에서 /demo-four에있는 모든 히트가 누구인가에 관계없이 마지막 순간을 사용합니다.

나는 MyCommonObject이 상태 정보를 저장한다고 가정합니다. 그렇지 않으면 무엇을하려고합니까? 이 상태 개체는 언제든지 /demo-one에 도달 할 때마다 다시 설정됩니다. 그럴 수 없어. 즉 컨트롤러에 상태를 저장하지 마십시오.

각 클라이언트에 MyCommonObject 인스턴스가 필요하므로 HttpSession에 저장하십시오.

+0

사실 나는 비행 예약 웹 응용 프로그램을 만들고 있습니다. 첫 번째 컨트롤러에서 API의 응답을받습니다. 가격, 예약 및 발권이라는 세 가지 단계에 대한 응답 개체가 필요합니다. 세션에 객체를 저장할 수 있지만 (응답 객체가 너무 무거울지라도), 실제로 사용자가 2 개의 다른 시스템에서 로그인하면 어떻게 될까요? 이 경우에 마지막 검색이 계속됩니다. – Yadvendra

+0

그런 다음 사용자 ID가 입력 된 불완전한 예약을 글로벌 맵에 저장해야합니다. 맵은 정적 필드, 싱글 톤의 인스턴스 필드 (컨트롤러와 같음) 또는 서블릿 애플리케이션 속성에있을 수 있습니다. 또한 데이터베이스에 저장하여 웹 응용 프로그램 서버의 재시작을 통해 유지하고 (매우 인기있는) 웹 응용 프로그램을 클러스터하면 공유 할 수 있습니다. 부실 예약을 철회하기위한 적절한 논리가 필요합니다. – Andreas

1

클래스를 @Component 및 싱글 톤으로 선언하는 것보다 중앙 집중식 서버를 사용하는 경우 한 번만 개체를 ​​초기화하십시오.

여러 서버가 포함 된 분산 환경에서 작업하는 경우 각 서버에는 자체 인스턴스가 있습니다. 이 경우 클래스를 보유 할 외부 서버를 사용해야하며 다른 모든 서버는 해당 서버에서 값을받습니다.

0

ControllersmyCommonObject을 사용하고이 객체가 사용자에게 특정되지 않은 상태 (즉, 범위가 전체 웹 응용 프로그램 임)를 보유하고있는 경우 스프링 응용 프로그램 컨텍스트에서이를 Bean으로 정의 할 수 있습니다 XML 또는 Java 구성 및 범위 단일성) 원하는 모든 Controller을 사용하십시오.

관련 문제