code

서블릿 관련 클래스에서 이름으로 JSF 관리 Bean 가져 오기

codestyles 2020. 8. 21. 07:47
반응형

서블릿 관련 클래스에서 이름으로 JSF 관리 Bean 가져 오기


@ManagedBeans이름 으로 참조하고 싶은 사용자 지정 서블릿 (AJAX / JSON 용)을 작성하려고합니다 . 다음을 매핑하고 싶습니다.

http://host/app/myBean/myProperty

에:

@ManagedBean(name="myBean")
public class MyBean {
    public String getMyProperty();
}

일반 서블릿에서 이름으로 빈을로드 할 수 있습니까? 사용할 수있는 JSF 서블릿이나 도우미가 있습니까?

나는이 모든 것이 너무 명백한 봄에 망가진 것 같다.


서블릿에서 다음을 통해 요청 범위 Bean을 가져올 수 있습니다.

Bean bean = (Bean) request.getAttribute("beanName");

및 세션 범위 Bean :

Bean bean = (Bean) request.getSession().getAttribute("beanName");

및 애플리케이션 범위 Bean :

Bean bean = (Bean) getServletContext().getAttribute("beanName");

의존성 주입이 가능한 프레임 워크 / 컨테이너에서 실행 중이고 Bean이 @NamedJSF 대신 CDI에서 관리되는 @ManagedBean경우 훨씬 더 쉽습니다.

@Inject
private Bean bean;

범위에 관계없이 실제로 내부에 있을 때 FacesContext(즉, 현재 HTTP 요청이를 통해 FacesServlet제공됨) 일반적인 JSF2 방식은 다음을 사용합니다 Application#evaluateExpressionGet().

FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);

다음과 같이 편리 할 수 ​​있습니다.

@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
    FacesContext context = FacesContext.getCurrentInstance();
    return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}

다음과 같이 사용할 수 있습니다.

Bean bean = findBean("bean");

그러나 이미 내부에 있으면 선언 적이기 때문에 @ManagedBean사용하는 @ManagedProperty것이 더 깨끗합니다.

@ManagedProperty("#{bean}")
private Bean bean;

다음 방법을 사용합니다.

public static <T> T getBean(final String beanName, final Class<T> clazz) {
    ELContext elContext = FacesContext.getCurrentInstance().getELContext();
    return (T) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, beanName);
}

이를 통해 반환 된 개체를 형식화 된 방식으로 가져올 수 있습니다.


이 링크와 같은 접근 방식을 시도해 보셨습니까? createValueBinding()여전히 사용 가능한지 확실하지 않지만 이와 같은 코드는 일반 오래된 서블릿에서 액세스 할 수 있어야합니다. 이것은 이미 존재하는 bean이 필요합니다.

http://www.coderanch.com/t/211706/JSF/java/access-managed-bean-JSF-from

 FacesContext context = FacesContext.getCurrentInstance();  
 Application app = context.getApplication();
 // May be deprecated
 ValueBinding binding = app.createValueBinding("#{" + expr + "}"); 
 Object value = binding.getValue(context);

이름을 전달하여 관리 Bean을 가져올 수 있습니다.

public static Object getBean(String beanName){
    Object bean = null;
    FacesContext fc = FacesContext.getCurrentInstance();
    if(fc!=null){
         ELContext elContext = fc.getELContext();
         bean = elContext.getELResolver().getValue(elContext, null, beanName);
    }

    return bean;
}

I had same requirement.

I have used the below way to get it.

I had session scoped bean.

@ManagedBean(name="mb")
@SessionScopedpublic 
class ManagedBean {
     --------
}

I have used the below code in my servlet doPost() method.

ManagedBean mb = (ManagedBean) request.getSession().getAttribute("mb");

it solved my problem.


I use this:

public static <T> T getBean(Class<T> clazz) {
    try {
        String beanName = getBeanName(clazz);
        FacesContext facesContext = FacesContext.getCurrentInstance();
        return facesContext.getApplication().evaluateExpressionGet(facesContext, "#{" + beanName + "}", clazz);
    //return facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, nomeBean);
    } catch (Exception ex) {
        return null;
    }
}

public static <T> String getBeanName(Class<T> clazz) {
    ManagedBean managedBean = clazz.getAnnotation(ManagedBean.class);
    String beanName = managedBean.name();

    if (StringHelper.isNullOrEmpty(beanName)) {
        beanName = clazz.getSimpleName();
        beanName = Character.toLowerCase(beanName.charAt(0)) + beanName.substring(1);
    }

    return beanName;
}

And then call:

MyManageBean bean = getBean(MyManageBean.class);

This way you can refactor your code and track usages without problems.

참고URL : https://stackoverflow.com/questions/2633112/get-jsf-managed-bean-by-name-in-any-servlet-related-class

반응형