2014-12-26 9 views
1

저장 버튼을 클릭 한 후 데이터베이스에 저장되는 int 및 문자열 값을 사용자가 입력하는 jsf 형식을 사용합니다.데이터베이스에 수동으로 설정된 값 저장

<h:form id="TbtestCreateForm"> 
    <p:inputText value="#{tbtestController.selected.name}" /> 
    <p:commandButton actionListener="#{tbtestController.saveNew}" value="#{myBundle.Save}" /> 
</h:form> 

나는 AbstractFacade 그 '바인딩'엔티티 클래스를 사용하여 인 AbstractController 클래스에 정의 된 CRUD 작업을 수행 Facade 패턴과 EJB를 사용하고 있습니다.

내가 필요한 건 하드 코드/수동으로 형식의 문자열 값을 설정하고 동일한 작업 (동일한 개체)에서 사용자가 알리는 int 값과 함께 데이터베이스에 저장합니다.

나는 다음과 같이하려고 노력했지만 성공하지 :

@Named 
public class MyBean implements Serializable { 

@Inject 
TbtestController tbtestController; 

private String myName; 
//GETTERS AND SETTERS 

@PostConstruct 
public void init() { 
    myName = "some foo name"; 
    Tbtest myTbtest = new Tbtest(); 
    myTbtest.setName(myName); 
    tbtestController.setSelected(myTbtest); 
    tbtestController.saveNew(null); // to simulate what the savNew method do 
} 

난에 복제 할 사용할 수있는 작은 넷빈즈 프로젝트를 만들어했습니다 아래 https://github.com/f6750699/webAppTest.git

에 정의 된 두 가지 방법을 다음과 AbstractController에 클래스 :

saveNew 방법 :

public void saveNew(ActionEvent event) { 
    String msg = ResourceBundle.getBundle("/MyBundle").getString(itemClass.getSimpleName() + "Created"); 
    persist(PersistAction.CREATE, msg); 
    if (!isValidationFailed()) { 
     items = null; // Invalidate list of items to trigger re-query. 
    } 
} 
이미 잠시 동안 거기에 붙어있어 때문에,

private void persist(PersistAction persistAction, String successMessage) { 
    if (selected != null) { 
     this.setEmbeddableKeys(); 
     try { 
      if (persistAction != PersistAction.DELETE) { 
       this.ejbFacade.edit(selected); 
      } else { 
       this.ejbFacade.remove(selected); 
      } 
      JsfUtil.addSuccessMessage(successMessage); 
     } catch (EJBException ex) { 
      Throwable cause = JsfUtil.getRootCause(ex.getCause()); 
      if (cause != null) { 
       if (cause instanceof ConstraintViolationException) { 
        ConstraintViolationException excp = (ConstraintViolationException) cause; 
        for (ConstraintViolation s : excp.getConstraintViolations()) { 
         JsfUtil.addErrorMessage(s.getMessage()); 
        } 
       } else { 
        String msg = cause.getLocalizedMessage(); 
        if (msg.length() > 0) { 
         JsfUtil.addErrorMessage(msg); 
        } else { 
         JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured")); 
        } 
       } 
      } 
     } catch (Exception ex) { 
      Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex); 
      JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/MyBundle").getString("PersistenceErrorOccured")); 
     } 
    } 
} 

정말 그것으로 어떤 도움을 주셔서 감사합니다 :

방법을 지속.

미리 감사드립니다.


폴 모리스 솔루션

바울이 제안 내가, 하나 개의 클래스에 집중했습니다

@Named 
@ViewScoped 
public class TbtestController extends AbstractController<Tbtest> { 

@EJB 
private TbtestFacade ejbFacade; 

public TbtestController() { 
    super(Tbtest.class); //-> there is already an invocation here, see below 
} 

@PostConstruct 
@Override 
public void init() { 
    super.setFacade(ejbFacade); 
//Paul Morris solution below 
    myName = "some foo name"; 
    this.setMyName(myName); 
    this.saveNew(null); // to simulate what the savNew method do 
} 

private String myName; 

public void setMyName(String name) { 
    myName = name; 
} 

@Override 
public void saveNew(ActionEvent event) { 
    this.getSelected().setName(myName); 
    //super.(event); // -> invocation of a superclass constructor must be the first line in the subclass constructor, but there is already one invocation, see above. Then, I've tried to invoke the super method: 
    super.saveNew(event); // but this didn't resolved, as it launches a NullPointerException, see below. 
} 
} 

예외 :

org.jboss.weld.exceptions.WeldException: WELD-000049: Unable to invoke public void beans.TbtestController.init() on [email protected] 
[...] 
Caused by: java.lang.NullPointerException 
at beans.TbtestController.saveNew(TbtestController.java:40) 
at beans.TbtestController.init(TbtestController.java:29) 
... 87 more 
+0

"* 성공하지 못함 *". 이 EL'# {tbtestController.selected.name}'이 (가) 'null'로 평가 되었습니까? 약간의 오류/예외 또는 심지어 완전히 다른/이상한 일이 발생합니까? – Tiny

+0

아니요,이 EL은 사용자가 문자열 값을 입력 할 때 제대로 작동하지만 정수 만 입력하면 문자열을 수동으로 설정해야합니다. 내가 시도한 것은'# {myBean.myName}'이며'value = "# {myBean.myName}": Target Unreachable, 식별자 'myBean'이 null로 해석되었습니다. 어떤 클래스에서 값을 설정하거나 하드 코딩해야하지만, 어디서 ... – jMarcel

+0

CDI 빈의 기본 범위는'@ Dependent'입니다. 당신이 필요로하는 적절한 범위를 지정해 주거나 bean이'@ Dependent' 범위를 가질 수 있습니까? – Tiny

답변

1

당신이 모든에 대해 겁니다 잘못된. AbstractController 클래스는 생성 된 그대로 둡니다. 대신 파생 클래스 인 TbtestController를 수정하고 하드 코딩 된 문자열에 대한 속성을 추가하십시오. 그리고 지금처럼 saveNew 메소드를 오버라이드 (override) :

private String myName; 

public void setMyName(String name) { 
    myName = name; 
} 

@Override 
public void saveNew(ActionEvent event) { 
    this.getSelected().setName(myName); 
    super.saveNew(event);  

} 

귀하의 콩 방법은 다음과 같이 뭔가를 코딩해야합니다

@PostConstruct 
public void init() { 
    myName = "some foo name"; 
    tbtestController.setMyName(myName); 

} 

당신이 전혀에서 myBean 클래스가 왜 확실하지 않다지만. 컨트롤러에 문자열을 하드 코딩 한 다음 질문 맨 위에있는 것처럼 컨트롤러의 saveNew 메서드를 사용하십시오.

UPDATE

이 시도 ...

@Named 
@ViewScoped 
public class TbtestController extends AbstractController<Tbtest> { 

    @EJB 
    private TbtestFacade ejbFacade; 

    public TbtestController() { 
     super(Tbtest.class); //-> there is already an invocation here, see below 
    } 

    @PostConstruct 
    @Override 
    public void init() { 
     super.setFacade(ejbFacade); 
     //Paul Morris solution below 
     myName = ""; 

    } 

    private String myName; 

    public void setMyName(String name) { 
     myName = name; 
    } 

    public String getMyName(String name) { 
     if (myName.isEmpty()) { 
      myName = "Default Value"; 
     } 
     return myName; 
    } 


    @Override 
    public void saveNew(ActionEvent event) { 
     this.getSelected().setName(this.getMyName(myName)); 
     super.saveNew(event); 
    } 
} 
+0

Paul Morris, 정말 고맙습니다.하지만 솔루션을 사용하려고했지만 몇 가지 문제가 아직 있습니다. 너, 제발, 업데이트 된 게시물을 확인하고 도와 줄래? 고마워. – jMarcel

+0

몇 가지 사항을 변경했습니다. 컨트롤러가 어떻게 보이는지에 대해서는 업데이트 섹션을 참조하십시오. 이것을 시도하면 효과가 있습니다. –

+0

그래, 네가 찾고있는 방식대로 정확히 해결 했어! 이것이 나에게 너무 중요하기 때문에, 어떻게 굴복 해야할지 모르겠다. 이봐 요, 정말 기뻐요 !! 신의 축복 이여, 형제! – jMarcel

0

주의 사항 : JSF에서 MVC 컨트롤러는 사용자가 작성한 코드되지 않습니다. FacesServlet 및 태그 구현입니다.

사람들이 JSF 백킹 빈 "XXXController"의 이름을 지정하면 나의 페달 릭적인 줄무늬가 생기게됩니다. 뒷받침 빈은 MODEL입니다. 액션 메소드 및 리스너는 컨트롤러 메소드가 아닌 MVC 기능입니다. 모든 컨트롤러는 View와 데이터를 복사하며 JSF는 사용자 코드를 사용하지 않고 자동으로이를 수행합니다.

+0

이미 알고 있습니다 (myBean.java 확인). 사실, 저는 그가 제안한대로 폴 모리스를 돕기 위해이 방법을 사용했습니다. 그러나 그것을 관찰 해 주셔서 감사합니다. – jMarcel