복붙노트

[SPRING] @RequestScoped bean의 데이터는 여러 브라우저에서 공유됩니다.

SPRING

@RequestScoped bean의 데이터는 여러 브라우저에서 공유됩니다.

나는 List 속성을 가진 @RequestScoped 빈을 가지고있다.

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.springframework.stereotype.Controller;

@Controller
@ManagedBean
@RequestScoped
public class MyBean implements Serializable {

    private List list;

    // getters and setters
}

이 속성은 데이터 테이블에 연결됩니다.

<ice:dataTable value="#{myBean.list}" ..other stuff.. />

목록은 문제없이 동적으로 채워지며 데이터 테이블은 문제없이 표시됩니다. 그러나 다른 페이지로 이동 한 다음 초기 페이지로 돌아 가면 데이터 테이블은 여전히 ​​초기 요청의 데이터와 함께 유지됩니다. 다시 비어서는 안됩니까? bean이 범위를 요청하면, 요청 후에 destroy되어야하며, 나는 datatable을 시작으로 비워야한다.

더 이상한 점은 하나의 브라우저 (Firefox와 같은)에서 페이지를 열고 요청과 함께 데이터 테이블을 채운 다음 다른 브라우저 (예 : Chrome)를 열고 데이터 테이블 페이지로 이동하면 이전 요청의 데이터로 채워진다는 점입니다 다른 브라우저에서! 나는 콩이 응용 프로그램처럼 행동한다고 ​​생각한다.

어떤 아이디어?

업데이트 1 : 클래스는 변수가 아니라 정적 변수입니다. 또한, 나는 tomcat 캐시를 비활성화하지만 여전히 작동하지 않습니다.

업데이트 2 : 아마도 문제를 발견했다고 생각합니다. 내 백킹 빈은 Spring의 @Controller로 주석 처리됩니다. @Autowired를 사용하여 서비스를 바인드하므로이 주석을 사용합니다. 이것이 싱글 톤을 만드는 것일 수 있으며 그 이유는 모든 요청에 ​​따라 생성되고 파괴되지 않는 이유는 무엇입니까? 나는이 문제가 Spring과 JSF2 주석의 혼합에 있다고 확신한다.

해결법

  1. ==============================

    1.JSF, CDI 및 Spring과 같은 여러 가지 빈 관리 프레임 워크로 단일 빈을 관리하면 안됩니다. 둘 중 하나를 선택하십시오. 예를 들어 Spring의 @Controller로 bean을 관리 할 때 JSF의 @ManagedBean 및 CDI의 @Named와 같은 다른 프레임 워크의 모든 bean 관리 관련 주석은 무시됩니다.

    JSF, CDI 및 Spring과 같은 여러 가지 빈 관리 프레임 워크로 단일 빈을 관리하면 안됩니다. 둘 중 하나를 선택하십시오. 예를 들어 Spring의 @Controller로 bean을 관리 할 때 JSF의 @ManagedBean 및 CDI의 @Named와 같은 다른 프레임 워크의 모든 bean 관리 관련 주석은 무시됩니다.

    저는 Spring을 사용하지 않고 표준 Java EE 6 API 대신에 왜 이것을 사용하고 있는지 알지 못합니다.하지만 증상과 문서는 그러한 Spring 빈의 범위가 실제로 응용 프로그램 범위를 기본값으로한다는 것을 나타냅니다. Spring @Scope 주석으로 빈 범위를 지정해야한다. 어쨌든 더 이상 가치가 없으므로 JSF 빈 관리 주석을 제거하고 개발자 / 유지 보수 자만 혼동하게됩니다.

    @Controller
    @Scope("request")
    public class MyBean implements Serializable {
        // ...
    }
    

    또는 Spring @Controller 어노테이션을 제거하고 JSF @ManagedBean을 고수 할 수도 있습니다. @Autowired 대신 @ManagedProperty를 사용하여 다른 @ManagedBean 인스턴스 또는 Spring 관리 Bean (Spring Faces EL 해결 프로그램을 구성한 경우) 또는 Java EE 표준 @EJB를 삽입하여 @Stateless 또는 @Stateful 인스턴스를 주입 할 수 있습니다.

    @ManagedBean
    @RequestScoped
    public class MyBean implements Serializable {
    
        @EJB
        private SomeService service;
    
        // ...
    }
    
  2. from https://stackoverflow.com/questions/10483115/data-from-requestscoped-bean-is-shared-in-different-browsers by cc-by-sa and MIT license