문제

나는 개찰구를 처음 접했고 다음 구성을 시도하고있었습니다.

class User {
   private String password;

   ...

   public void setPassword(String password) {
     this.password = MD5.encode(password);
   }
   ...
}

다음을 사용하여 비밀번호에 바인딩하고 PropertyModel의 기본 구현이 기본적으로 속성이 아닌 필드에 바인딩된다는 것을 알게 된 후 (이상한 이름 EH?)

add(new PasswordTextField("password", new PropertyModel(user, "password"));

왜 세상에서 그들은 이런 식으로 그것을 구현했을까요? 그리고 기본적으로 getter와 setter를 사용하는 PropertyModel 대안이 있습니까?

고맙습니다?

도움이 되었습니까?

해결책

PropertyModel 이미 원하는 것을 할 것입니다. A. PropertyModel 그 가치에 대해 쿼리되어 두 곳에서 보입니다.

  • 주어진 속성에 대해 "getter"방법이 존재하는 경우 PropertyModel 속성의 가치를 회수하기 위해 Getter에게 전화하십시오. 구체적으로, PropertyModel 이름이 지정된 메소드를 찾습니다 get<Property>, 어디 <Property> 속성 표현식이 PropertyModel 생성자 및 반사가 존재하는 경우 반사를 사용하여 메소드를 호출합니다.

  • "getter"메소드가 존재하지 않으면 PropertyModel 속성 필드의 값을 직접 반환합니다. 구체적으로, PropertyModel 반사 사용 반사를 찾으십시오. PropertyModel 건설자. 일치하는 필드가 발견되면 PropertyModel 필드의 가치를 반환합니다. 주목하십시오 PropertyModel 경기를 위해 공공 필드 외에 개인 및 보호 된 필드를 점검합니다.

귀하의 경우에 사용 된 속성 표현식 PropertyModel 생성자입니다 "password", 그래서 PropertyModel 먼저에서 메소드를 찾습니다 user 객체 호출 getPassword. 그러한 방법이 존재하지 않으면 PropertyModel 개인의 가치를 반환합니다 password 대신 필드.

당신의 경우 PropertyModel "getter"라고 부르는 대신 개인 필드의 가치를 반환하고 있습니다. User 수업. 예를 들어, 실수로 입력했습니다 getPasssword (3 S와 함께), PropertyModel 그것을 찾지 못하고 개인 분야를 반환하는 데 방해가됩니다.


편집하다

당신이 마음에 들지 않는다면 PropertyModel기본 동작, 서브 클래스를 만들 수 있습니다. PropertyModel 이는 개찰구가 개인 필드를 읽고 쓰려고하지 못하게합니다. 이렇게하면 모든 속성 액세스가 게터와 세터를 통해 발생하도록 강요 할 수 있습니다.

나는 예를 썼다 BeanPropertyModel 이것을 보여주는 수업 :

import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.model.PropertyModel;

/**
 * A custom implementation of {@link org.apache.wicket.model.PropertyModel}
 * that can only be bound to properties that have a public getter or setter method.
 * 
 * @author mspross
 *
 */
public class BeanPropertyModel extends PropertyModel {

    public BeanPropertyModel(Object modelObject, String expression) {
        super(modelObject, expression);
    }

    @Override
    public Object getObject() {
        if(getPropertyGetter() == null)
            fail("Missing getter");
        return super.getObject();               
    }

    @Override
    public void setObject(Object modelObject) {
        if(getPropertySetter() == null)
            fail("Missing setter");
        super.setObject(modelObject);
    }

    private void fail(String message) {

        throw new WicketRuntimeException(
                String.format("%s. Property expression: '%s', class: '%s'.",
                        message,
                        getPropertyExpression(),
                        getTarget().getClass().getCanonicalName()));
    }
}

다른 팁

Mike Spross의 훌륭한 대답! 그러나 하나의 작은 추가 :

이 경우 속성 모델을 사용하지 않을 것입니다. 그냥 써

 new Model<String>(){ getObject(){...} setObject(){...}}

정확히 원하는 바하비를 구현하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top