Ошибка проверки пользовательского компонента jsf с использованием @Pattern - PullRequest
0 голосов
/ 03 октября 2018

Моя проблема в том, что в моей форме есть пользовательский компонент ввода, который нарушает процесс проверки.
При первом представлении проверка работает, если вход действителен или нет.Я получаю ожидаемое поведение: сообщение об ошибке, если оно недействительно, продолжить рабочий процесс, если оно действительно.
Проблема возникает после того, как первая отправка не удалась: при второй отправке валидатор всегда возвращает недопустимое состояние, является ли отправленное значениедействителен или нет.

Ниже код рендерера:

public abstract class MyInput extends UIInput {

private final static String CONTROLLED_INPUT_SUFFIX = "_controlled";

@Override
public void decode(final FacesContext context) {
    final Map<String, String> requestMap = context.getExternalContext().getRequestParameterMap();
    final String clientId = getClientId(context);
    final String submitted_hello_msg = requestMap.get(clientId);
    setSubmittedValue(submitted_hello_msg);
}

@Override
public void encodeEnd(final FacesContext context) throws IOException {
    final String clientId = getClientId(context);
    encodeInputField(context, clientId);
}

private void encodeInputField(final FacesContext context, final String clientId) throws IOException {
    final ResponseWriter writer = context.getResponseWriter();
    final Object value = getValue();
    // on récupère les attributs du tag
    final Map<String, Object> attributes = getAttributes();

    // Ecriture du input qui servira d'IHM
    writer.startElement("input", this);
    // Gestion des attributs de base
    if (attributes.containsKey("id")) {
        writer.writeAttribute("id", attributes.get("id"), null);
    }
    if (attributes.containsKey("onkeydown")) {
        writer.writeAttribute("onkeydown", attributes.get("onkeydown"), null);
    }
    if (attributes.containsKey("label")) {
        writer.writeAttribute("label", attributes.get("label"), null);
    }
    if (attributes.containsKey("required")) {
        writer.writeAttribute("required", attributes.get("required"), null);
    }

    writer.writeAttribute("type", "text", null);
    // writer.writeAttribute("name", clientId + CONTROLLED_INPUT_SUFFIX,
    // null);
    writer.writeAttribute("name", clientId, "clientId");

    if (value != null) {
        writer.writeAttribute("value", value.toString(), "value");
    } else { 
        writer.writeAttribute("value", "", "value");
    }

    writer.endElement("input");


    final String valueTmp = value != null ? value.toString() : "";
    final String script = getScript(valueTmp, clientId);

    writer.startElement("script", this);
    writer.writeAttribute("type", "text/javascript", null);
    writer.writeText(script, null);
    writer.endElement("script");
}
/**
 * Returns a script that modifies the value of the input to controll its
 * content
*/  
protected abstract String getScript(String value, String clientId);

}

Использование компонента JSF:

<mylib:MyInput label="#{messages['myLabel']}"
    value="#{MyController.myField}"
    required="true" maxlength="23">
</myLib:MyInput>

Детали контроллера:

@Name("searchDossierEmetteurActionHome")
@Scope(ScopeType.CONVERSATION)
@BypassInterceptors
@SuppressWarnings("serial")
public class MyController extends Controller {
    @Pattern(regex = CommonAction.PATTERN, message = "#{messages['invalidMesage']}")
    String myField;

    public String action() {
        ...
    }
}

Обратите внимание, что когда я заменяю свой пользовательский ввод на classiqu, у меня нет этой проблемы, он работает нормально, и я не вижу различий в запросах на публикацию.
Я пропустилпараметр в конструкции моего компонента?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...