Ответ 1
Вероятно, это недосмотр в реализация по умолчанию Mojarra UIViewParameter#getStringValueFromModel()
, источник которого приведен ниже:
384 public String getStringValueFromModel(FacesContext context)
385 throws ConverterException {
386 ValueExpression ve = getValueExpression("value");
387 if (ve == null) {
388 return null;
389 }
390
391 Object currentValue = ve.getValue(context.getELContext());
392
393 // If there is a converter attribute, use it to to ask application
394 // instance for a converter with this identifer.
395 Converter c = getConverter();
396
397 if (c == null) {
398 // if value is null and no converter attribute is specified, then
399 // return null (null has meaning for a view parameters; it means remove it).
400 if (currentValue == null) {
401 return null;
402 }
403 // Do not look for "by-type" converters for Strings
404 if (currentValue instanceof String) {
405 return (String) currentValue;
406 }
407
408 // if converter attribute set, try to acquire a converter
409 // using its class type.
410
411 Class converterType = currentValue.getClass();
412 c = context.getApplication().createConverter(converterType);
413
414 // if there is no default converter available for this identifier,
415 // assume the model type to be String.
416 if (c == null) {
417 return currentValue.toString();
418 }
419 }
420
421 return c.getAsString(context, this, currentValue);
422 }
Этот метод вызывается для каждого UIViewParameter
(компонента пользовательского интерфейса за <f:viewParam>
) при построении строки запроса для includeViewParams=true
. В источнике мы видим, что он вызывает конвертер, независимо от того, является ли currentValue
null
или нет. Другими словами, даже если значение модели null
, оно по-прежнему вызывает конвертер с ним.
В соответствии с javadoc of Converter#getAsString()
преобразователи являются спецификациями, требуемыми для возврата строки String с нулевой длиной, если значение null
:
getAsString
...
Возвращает: строка с нулевой длиной, если значение
null
, в противном случае результат преобразования
Итак, конвертеры фактически не должны возвращать null
на getAsString()
. Затем они возвращают пустую строку. В случае параметров представления в строке запроса это крайне нежелательно. Разница между пустым строковым значением и полным отсутствием в строке запроса действительно значительна.
Я сообщил об этом ребятам Mojarra как issue 3288. Затем они должны решить эту проблему следующим образом:
391 Object currentValue = ve.getValue(context.getELContext());
392
393 if (currentValue == null) {
394 return null;
395 }
В то же время я передал решение OmniFaces. Это исправление <o:viewParam>
. Он доступен сегодня 1.8 моментальный снимок.
<f:metadata>
<o:viewParam name="id" value="#{testManagedBean.id}" converter="javax.faces.Long"/>
</f:metadata>
Обновить: они решили не исправлять. В любом случае OmniFaces.