1

コンバーターとバリデーターを単一のフィールドに追加しようとすると、現在、上記で指定された問題が発生しています。以前に使用したことがあるので、これら2つがどのように機能するかはわかりますが、1つのフィールドで両方を試したのはこれが初めてです。これが私のコードです:

<p:selectOneMenu id="bussProgram"
    value="#{signupWizardBean.subscription.businessProgram}">
    <f:converter binding="#{membershipProgramConverter}"></f:converter>
    <f:validator binding="#{dropdownValidator}"></f:validator>
    <f:selectItems value="#{signupWizardBean.membershipPrograms}"
        var="plan" itemValue="#{plan}"
        itemLabel="#{plan.description}" />
</p:selectOneMenu>

コンバータ

@Named
@ApplicationScoped
public class MembershipProgramConverter implements Converter {
    @PersistenceContext
    private transient EntityManager em;

    @Inject
    private Logger log;

    @Override
    public Object getAsObject(FacesContext ctx, UIComponent component,
        String value) {
    if (StringUtils.isBlank(value) || value.equals("0"))
        return null;

    return em.find(MembershipProgram.class, new Long(value));
}

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object o) {
        MembershipProgram mp = (MembershipProgram) value;
    return mp.getId() != null ? String.valueOf(mp.getId()) : null;
    }
}

バリデーター:

@Named
@ApplicationScoped
public class DropdownValidator implements Validator, Serializable {
    private static final long serialVersionUID = -456545939475878299L;

    @Inject
    private ResourceBundle bundle;

    @Inject
    private FacesContext facesContext;

    @Inject
    private Logger log;

    @Override
    public void validate(FacesContext context, UIComponent component,
        Object value) throws ValidatorException {
    log.debug("[dropship-web] validating value={}", value);
    if (value == null) {
        FacesMessage msg = new FacesMessage(
                bundle.getString("error.requiredField"),
                bundle.getString("error.requiredField"));
        msg.setSeverity(FacesMessage.SEVERITY_ERROR);
        facesContext.addMessage("promoCode", msg);

        throw new ValidatorException(msg);
    }
}
}

エンティティクラス:

@Entity
@Table(name = "CRM_MEMBERSHIP_PROGRAMS", uniqueConstraints = @UniqueConstraint(columnNames = { "code" }))
@SequenceGenerator(name = "ID_GENERATOR", sequenceName = "CRM_MEMBERSHIP_PROGRAM_SEQ")
public class MembershipProgram extends BaseEntity {
    private static final long serialVersionUID = -7796298586810386239L;

    @Size(max = 25)
    @Column(name = "CODE", nullable = false)
    private String code;

    @Size(max = 100)
    @Column(name = "DESCRIPTION", nullable = true)
    private String description;

    public MembershipProgram() {

    }

    public MembershipProgram(long id, String description) {
        setId(id);
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = super.hashCode();
        result = prime * result + ((code == null) ? 0 : code.hashCode());
        result = prime * result
                + ((description == null) ? 0 : description.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (!super.equals(obj))
            return false;
        if (getClass() != obj.getClass())
            return false;
        MembershipProgram other = (MembershipProgram) obj;
        if (code == null) {
            if (other.code != null)
                return false;
        } else if (!code.equals(other.code))
            return false;
        if (description == null) {
            if (other.description != null)
                return false;
        } else if (!description.equals(other.description))
            return false;
        return true;
    }
}

デバッグ時に、MembershipProgramConverter.getAsObject / getAsString、DropdownValidator.validateメソッドの両方が呼び出されることに注意してください。

また、ドロップダウンリストから選択したアイテムがある場合とない場合で、次の問題が発生していることもわかりました。

.validation.UnexpectedTypeException: HV000030: No validator could be found for type: com.czetsuya.models.membership.MembershipProgram.
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: com.czetsuya.models.membership.MembershipProgram.
4

1 に答える 1