我从jsp url: "ProductByName"
调用自动完成功能。
在控制台中响应时显示
POST http://localhost:8082/Store/SingleProduct 500 (Internal Server Error)
在jsp中
$(".name").autocomplete({
source: function(request, response) {
$.ajax({
url: "ProductByName",
dataType: "json",
data: {
str: request.term,
maxRows: 5
},...
在struts.xml
<action name="ProductByName" class="iland.productdetails.ProductDetailsAction" method="fetchByProductName">
<result type="json">
<param name="includeProperties">productList\[\d+\]\.id,
productList\[\d+\]\.name,
productList\[\d+\]\.description
</param>
<param name="excludeNullProperties">true</param>
</result>
</action>
我想只获取productList
在Action类
中public class ProductDetailsAction extends ActionSupport {
private long id;
private String barCode;//bardoce
private String name;
private String desc;
private long quantity;
private float unitPrice;
private float sellingPrice;
private float totalSellingPrice;
private long clientId;
private ArrayList<BillDetails> BillList;
private Date startDate;
private Date endDate;
private int discountPercentage;
private Timestamp addDate;
private String dataStatus;
private ArrayList<ProductDetailsAction> productList;
private ArrayList<Product> productBillList;
public String fetchByProductName() {
ProductDetailsBusiness pdb = new ProductDetailsBusiness();
Map data = pdb.fetchByProductName(getName());
setProductList((ArrayList) data.get("list"));
return SUCCESS;
}
//other methods and getter and setter
}
我遇到了异常
SEVERE: Exception occurred during processing request: org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: iland.hbm.Client.billDetailses, no session or session was closed
org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: iland.hbm.Client.billDetailses, no session or session was closed
at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:246)
at org.apache.struts2.json.JSONWriter.processCustom(JSONWriter.java:178)
at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:168)
at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:134)
at org.apache.struts2.json.JSONWriter.write(JSONWriter.java:102)
at org.apache.struts2.json.JSONUtil.serialize(JSONUtil.java:116)
at org.apache.struts2.json.JSONResult.createJSONString(JSONResult.java:197)
at org.apache.struts2.json.JSONResult.execute(JSONResult.java:171)
at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:371)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:161)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:563)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:744)
Caused by: org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: iland.hbm.Client.billDetailses, no session or session was closed
at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:246)
at org.apache.struts2.json.JSONWriter.processCustom(JSONWriter.java:178)
at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:168)
at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:134)
at org.apache.struts2.json.JSONWriter.add(JSONWriter.java:390)
at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:231)
... 71 more
Caused by: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: iland.hbm.Client.billDetailses, no session or session was closed
at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:246)
at org.apache.struts2.json.JSONWriter.processCustom(JSONWriter.java:178)
at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:168)
at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:134)
at org.apache.struts2.json.JSONWriter.add(JSONWriter.java:390)
at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:231)
... 76 more
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: iland.hbm.Client.billDetailses, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
at org.hibernate.collection.PersistentSet.equals(PersistentSet.java:429)
at java.util.Vector.indexOf(Vector.java:408)
at java.util.Vector.contains(Vector.java:367)
at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:117)
at org.apache.struts2.json.JSONWriter.add(JSONWriter.java:390)
at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:231)
... 81 more
编辑:fetchByProductName(getName());
方法仅包含Jdbc代码。那为什么Hibernate Errorrs ??
我从数据库中获取日期并在控制台上打印。在成功之前我给了System.out.println(
在行动中);
这也是正确打印的
它不必从数据库访问数据然后failed to lazily initialize a collection of XXX
如何解决这个问题。
修改
public class ProductDetailsBusiness {
ProductDetailsAction pda = null;
PreparedStatement ps = null;
ResultSet rs = null, res = null;
Connection con = null;
String status = null;
ArrayList<ProductDetailsAction> ar = null;
public Map fetchByProductName(String name, long cid) {
System.out.println(" ProductBusiness fetchByProductName()");
status = "success";
System.out.println("Name is " + name);
ar = new ArrayList();
con = ConnectionFactory.getConnection();
try {
String query = "select * from product "
+ "where status=? and cid=? "
+ "order by add_date";
ps = con.prepareStatement(query);
ps.setString(1, "active");
ps.setLong(2, cid);
System.out.println("Before execution");
res = ps.executeQuery();
System.out.println("Details are");
while (res.next()) {
pda = new ProductDetailsAction();
long id1 = res.getLong("id");
String barCode = res.getString("barcode");
String name1 = res.getString("name");
String desc = res.getString("description");
long quntity = res.getLong("quntity");
float unit_price = res.getLong("unit_price");
float selling_price = res.getLong("selling_price");
int discount_percent = res.getInt("discount_percent");
pda.setId(id1);
pda.setBarCode(barCode);
pda.setName(name1);
pda.setDesc(desc);
pda.setQuantity(quntity);
pda.setUnitPrice(unit_price);
pda.setSellingPrice(selling_price);
pda.setDiscountPercentage(discount_percent);
System.out.println("id "+id1+" name "+name1+" "+desc);
ar.add(pda);
}
con.close();
} catch (SQLException s) {
status = "failure";
System.out.println("SQL code does not execute." + s);
} finally {
try {
if (con != null) {
con.close();
}
} catch (SQLException sqe) {
status = "failure";
System.out.println("SQLException " + sqe);
}
}
Map m = new HashMap();
m.put("status", status);
m.put("list", ar);
return m;
}
//other methods
}
同时更新动作类也请看
答案 0 :(得分:1)
LazyInitializationException
是此问题的根本原因,当Struts 2 json插件尝试序列化您的productList
对象时,会抛出此问题。根据例外文件
(它)表示访问会话上下文之外的未获取数据。 例如,访问未初始化的代理或集合时 会议结束后。
这意味着您正在尝试访问从数据库中以java的形式加载hibernate代理形式的billDetailses
实体的集合。根据休眠 document
如果在会话范围之外访问未初始化的集合或代理,即当拥有集合或具有对代理的引用的实体处于分离状态时,Hibernate将抛出LazyInitializationException。
所以这意味着list
billDetailses
的{{1}}集合未初始化,您可以在完成操作之前强制初始化
使用
Hibernate.initialize(data) // collection entity
在集合映射上设置FetchType.EAGER
也解决了这个问题,但它会在billDetailses
对象中添加,因为每次在java中加载此对象时,它的集合都将被强制加载并从我的考虑就像购买法拉利并一直以1档运行。
如果您经常收到LazyInitializationException
,我建议您尝试使用OpenSessionInViewFilter
,这样可以让您的hibernate会话从请求开始一直打开,直到您的应用程序完成响应。
答案 1 :(得分:0)
JSON的序列化过程由JSON结果控制,该结果是您在项目中使用的JSON plugin的一部分。并且您已经知道,要限制序列化程序使用的属性,您应该使用includeProperties
结果的json
。您还应该检查root
属性。如果未指定,则json结果默认使用值堆栈的top
对象。如果您的操作是模型驱动的,则模型会覆盖操作。因此,您在includeProperties
中使用的正则表达式适用于模型对象,而JSONWriter
的序列化程序使用BeanInfo
来提取bean的属性。首先,检查这些属性是否存在@JSON
注释,如果它有serialize=false
,则跳过它,否则包含它。这样,您可以通过在不会序列化为JSON的属性(例如@OneToMany
属性等)上添加注释来控制序列化过程。然后检查includeProperties
或excludeProperties
是否为LazyInitializationException
或@JSON
不是空的。此时您应该确认,如果您没有与指定模式匹配的属性,那么它们将不会被序列化。所以,让我们转到serialize=false
,正如我所说,如果您在模型层次结构中有true
注释,则应将@JSON(serialize=false)
public Object getBillDetailses(){ return billDetailses; }
置于其中,因为默认情况下它是productList
。
<!-- Result config -->
<result type="json">
<param name="includeProperties">
^productList\[\d+\]\.id,
^productList\[\d+\]\.name,
^productList\[\d+\]\.description
</param>
<param name="root">
#action
</param>
</result>
你在动作类中说过^
,那么你应该配置结果
{{1}}
注意,{{1}}代表开始表达式,因此只包含动作属性。