Моя проблема в том, что в моей форме есть пользовательский компонент ввода, который нарушает процесс проверки.
При первом представлении проверка работает, если вход действителен или нет.Я получаю ожидаемое поведение: сообщение об ошибке, если оно недействительно, продолжить рабочий процесс, если оно действительно.
Проблема возникает после того, как первая отправка не удалась: при второй отправке валидатор всегда возвращает недопустимое состояние, является ли отправленное значениедействителен или нет.
Ниже код рендерера:
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, у меня нет этой проблемы, он работает нормально, и я не вижу различий в запросах на публикацию.
Я пропустилпараметр в конструкции моего компонента?