2011-05-30 2 views
1

Когда я получить доступ к JPA удалось значение даты из JSF, он возвращается с javax.faces.component.UdateModelException говоряДата исключения преобразования в JSF составного компонента

'Cannot convert 01.01.10 00:00 of type class java.util.Date to class org.apache.openjpa.util.java$util$Date$proxy 

Использование JPA-управляемое значение даты (который означает, что она проксируется) отлично работает, когда он используется непосредственно из EL нравится это:

'<h:outputLabel value="MyDateValue" for="input"/> 
'<h:inputText id="inputDate" value="#{bean.myDate}"/> 

Однако, это вызывает проблемы при попытке использовать его с составными компонентами и возвращает следующий конвертер исключение и, таким образом, может» t обновить модель ...

The (упрощенный) JSF составной компонент inputDate.xhtml

<head> 
      <title>A date input field</title> 
    </head> 

    <composite:interface> 
      <composite:attribute name="dateValue"/> 
    </composite:interface> 

    <composite:implementation> 
      <h:outputLabel value="MyDateValue" for="input"/> 
      <h:inputText id="input" value="#{cc.attrs.dateValue}"/> 
    </composite:implementation> 

Предположение: кажется замена прокси в OpenJPA обрабатывается по-разному, когда значение осуществляется доступ внутри композита. Я предполагаю, что EL-resolver обрабатывает вызовы значений объекта по-разному, когда он передается в композиты. Передача его в композиты означает, что он впервые доступен в составе, что слишком поздно, и требуемая замена прокси-сервера не выполнена (таким образом, исключение преобразователя)

Итак, я попытался изменить язык выражений для MyFaces, но он не работал в Websphere, хотя я поменял загрузку класса на родителя последним и предоставил el-impl и el-api из glassfish в папке lib и вставил необходимый контекст-параметр для MyFaces.

Как вы, ребята, используете JPA-управляемые даты (или другие проксированные объекты) в составных компонентах ???

+0

Вы, кажется, подразумеваете, что он работает, когда не используется составной компонент (поэтому при использовании компонента непосредственно на странице «обычным способом»). Это правда? – BalusC

+0

@BalusC Право. Использование этого «напрямую» работает так, как ожидалось. Я обнаружил, что MyFaces Resolver можно отсортировать по https://cwiki.apache.org/MYFACES/elresolver-ordering.html и немного поиграть с ним, но без успеха. Использование другого ELFactoryImpl (JBoss El 2.0.1) делает трюк для дат профайла JPA, хотя было сложно зарегистрировать его в WebSphere 8. Однако вызовы методов не работают с этим el больше ... – jonnie119

+0

Я никогда раньше видел эту проблему, но я также не использую MyFaces. У вас есть шанс попробовать Mojarra вместо MyFaces, хотя это просто исключить тот и другой. – BalusC

ответ

1

Если вы используете солнце реализации EL вы можете использовать следующую ELResolver, который работает вокруг этого вопроса:

public class BugfixELResolver extends ELResolver { 
//... 
@Override 
public Class<?> getType(ELContext anElContext, Object aBase, Object aProperty) { 
    if (aBase.getClass().getCanonicalName().equals("com.sun.faces.el.CompositeComponentAttributesELResolver.ExpressionEvalMap")){ 
     Object tempProperty=((Map)aBase).get(aProperty); 
     if (tempProperty!=null&&tempProperty.getClass().getCanonicalName().equals("org.apache.openjpa.util.java.util.Date.proxy")) { 
      anElContext.setPropertyResolved(true); 
      return java.util.Date.class; 
     } 
    } 
    return null; 
} 


} 

Добавьте его к граням-конфигурации таким образом:

<el-resolver> 
    xxx.BugfixELResolver 
</el-resolver> 

Это обходное решение также может использоваться в средах, где вы не можете изменить реализацию EL (например, websphere и т. Д.).

+0

хорошая обходная идея. однако он решается в новой версии webpshere. я помечаю ваше решение как принятое – jonnie119

1

Вот обходной путь. Кажется, что проблема заключается в реализации ExpressionLanguage WebSpheres или, скорее, в порядке решения. Регистрация реализации JBoss EL выполняется и разрешает прокси до даты вызова составного компонента. Я также попытался Glassfish EL, но это не сработало ...

Регистрация альтернативу EL довольно странно: Установка в web.xml для MyFaces является

<context-param> 
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name> 
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value> 
</context-param> 

Кроме того под WebContent/META-INF/services/ виде файла с этой одной строкой javax.el.expressionFactoryorg.jboss.el.ExpressionFactoryImpl. Класс происходит от jboss-el-2.0.2.CR1.jar (извините, не смог найти ссылку на Maven репо)

Я буду держать вас в курсе, как только я найти лучшее решение ...

+0

обновление: оказалось, что это эль-проблема с Websphere, целью которой является исправление с версией 8.0.0.2 – jonnie119

Смежные вопросы