Если R будет точно соответствовать S4, было бы достаточно:
setMethod («+», подпись (e1 = «character», e2 = «character»), функция (e1, e2) {paste (e1, e2, sep = "")})
Но это дает ошибку, что метод запечатан: ((Надеюсь, это изменится в функциональные версии R.
Лучшее, что вы можете сделать, это определить новую строку класса, которая будет вести себя точно так же, как класс «character»:
setClass ("string" , содержит = "символ") string & lt; - function (obj) new ("string", as.character (obj))
и определяет наиболее общий метод, который позволяет R: [ ! d7]
setMethod ("+", подпись (e1 = "character", e2 = "ANY"), строка функции (e1, e2) (вставить (e1, as.character (e2), sep = "")))
теперь попробуйте:
tt & lt; - string (44444) tt # Объект класса "string" # [1 ] "44444" tt + 3434 # [1] "444443434" "sfds" + tt # [1] "sfds44444" tt + tt # [1] "4444444444" 343 + tt #Error в 343 + tt: нечисловой аргумент до b inary operator "sdfs" + tt + "dfsd" # Объект класса "string" # [1] "sdfs44444dfsd"
Вы пытались добавить строки ниже к своему web.xml
?
<context-param>
<param-name>com.sun.faces.enableRestoreView11Compatibility</param-name>
<param-value>true</param-value>
</context-param>
Я нашел, что это очень эффективно, когда я столкнулся с этой проблемой.
<o:enableRestorableView>
вместо контекстного параметра приложения.
– BalusC
13 August 2015 в 07:16
Добавьте эту строку в свой web.xml. Это работает для меня
<context-param>
<param-name>org.ajax4jsf.handleViewExpiredOnClient</param-name>
<param-value>true</param-value>
</context-param>
Я сам столкнулся с этой проблемой и понял, что это связано с побочным эффектом фильтра, который я создал, который фильтрует все запросы на аппликацию. Как только я изменил фильтр, чтобы выбрать только определенные запросы, эта проблема не возникала. Может быть, хорошо проверить такие фильтры в вашем приложении и посмотреть, как они себя ведут.
Я добавлю следующую конфигурацию в web.xml, и она была решена.
<context-param>
<param-name>com.sun.faces.numberOfViewsInSession</param-name>
<param-value>500</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.numberOfLogicalViews</param-name>
<param-value>500</param-value>
</context-param>
Вы можете использовать свой собственный обработчик исключений Ajax или perffaces-extensions
Обновить ваши faces-config.xml
...
<factory>
<exception-handler-factory>org.primefaces.extensions.component.ajaxerrorhandler.AjaxExceptionHandlerFactory</exception-handler-factory>
</factory>
...
Добавить следующий код на странице jsf
...
<pe:ajaxErrorHandler />
...
Я получал эту ошибку: javax.faces.application.ViewExpiredException.Когда я использую разные запросы, я обнаружил тех, у кого есть тот же JsessionId, даже после перезапуска сервера. Так что это связано с кешем браузера. Просто закройте браузер и попробуйте, он будет работать.
Когда наша страница простаивает в течение x времени, срок действия представления истекает, и бросает javax.faces.application.ViewExpiredException, чтобы это не происходило, одним из решений является создание CustomViewHandler, который расширяет ViewHandler и переопределяет метод restoreView. Все остальные методы делегирован родителям
import java.io.IOException;
import javax.faces.FacesException;
import javax.faces.application.ViewHandler;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
public class CustomViewHandler extends ViewHandler {
private ViewHandler parent;
public CustomViewHandler(ViewHandler parent) {
//System.out.println("CustomViewHandler.CustomViewHandler():Parent View Handler:"+parent.getClass());
this.parent = parent;
}
@Override
public UIViewRoot restoreView(FacesContext facesContext, String viewId) {
/**
* {@link javax.faces.application.ViewExpiredException}. This happens only when we try to logout from timed out pages.
*/
UIViewRoot root = null;
root = parent.restoreView(facesContext, viewId);
if(root == null) {
root = createView(facesContext, viewId);
}
return root;
}
@Override
public Locale calculateLocale(FacesContext facesContext) {
return parent.calculateLocale(facesContext);
}
@Override
public String calculateRenderKitId(FacesContext facesContext) {
String renderKitId = parent.calculateRenderKitId(facesContext);
//System.out.println("CustomViewHandler.calculateRenderKitId():RenderKitId: "+renderKitId);
return renderKitId;
}
@Override
public UIViewRoot createView(FacesContext facesContext, String viewId) {
return parent.createView(facesContext, viewId);
}
@Override
public String getActionURL(FacesContext facesContext, String actionId) {
return parent.getActionURL(facesContext, actionId);
}
@Override
public String getResourceURL(FacesContext facesContext, String resId) {
return parent.getResourceURL(facesContext, resId);
}
@Override
public void renderView(FacesContext facesContext, UIViewRoot viewId) throws IOException, FacesException {
parent.renderView(facesContext, viewId);
}
@Override
public void writeState(FacesContext facesContext) throws IOException {
parent.writeState(facesContext);
}
public ViewHandler getParent() {
return parent;
}
}
Затем вам нужно добавить его в ваши faces-config.xml
<application>
<view-handler>com.demo.CustomViewHandler</view-handler>
</application>
Спасибо за исходный ответ по ссылке ниже: http://www.gregbugaj.com/?p=164
Избегайте многочастных форм в Richfaces:
<h:form enctype="multipart/form-data">
<a4j:poll id="poll" interval="10000"/>
</h:form>
Если вы используете Richfaces, я обнаружил, что запросы ajax внутри многочастных форм возвращают новый идентификатор просмотра по каждому запросу.
Как отлаживать:
При каждом запросе ajax возвращается идентификатор вида, это нормально, если идентификатор просмотра всегда один и тот же. Если вы получаете новый идентификатор просмотра по каждому запросу, тогда возникает проблема и его необходимо устранить.
Сначала, что вам нужно сделать, прежде чем менять web.xml, убедитесь, что ваш ManagedBean implements Serializable
:
@ManagedBean
@ViewScoped
public class Login implements Serializable {
}
Особенно, если вы используете MyFaces