Здесь я рассматриваю несколько случаев, через которые вы можете очистить концепцию
1. ArrayList<String> arr = new ArrayList<String>();
2. ArrayList<String> arr = new ArrayList();
3. ArrayList arr = new ArrayList<String>();
ArrayList<String> arr
является ссылочной переменной ArrayList
с типом String
, которые ссылаются на объект ArralyList
типа String
. Это означает, что он может содержать только объект типа String.
Строго для String
не для Raw Type, поэтому он никогда не будет предупреждать.
arr.add("hello");// alone statement will compile successfully and no warning.
arr.add(23); //prone to compile time error.
//error: no suitable method found for add(int)
В этом случае ArrayList<String> arr
является строгим типом, но ваш объект new ArrayList();
является сырым типом.
arr.add("hello"); //alone this compile but raise the warning.
arr.add(23); //again prone to compile time error.
//error: no suitable method found for add(int)
здесь arr
является строгим типом. Таким образом, он будет поднимать ошибку времени компиляции при добавлении integer
.
Предупреждение: - Объект типа
blockquote>Raw
ссылается на типStrict
Referenced VariableArrayList
.Случай 3
В этом случае
ArrayList arr
является сырым типом, но ваш Objectnew ArrayList<String>();
является строгим типом.arr.add("hello"); arr.add(23); //compiles fine but raise the warning.
Он добавит в него любой тип объекта, потому что
arr
является сырым типом.Внимание: - A
blockquote>Strict
Тип Объект ссылается на araw
тип, на который ссылается переменная.
Вы пытались добавить строки ниже к своему 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>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