gpt4 book ai didi

java - 警告[CommonsLogger.java :60] ognl. MethodFailedException : Method failed for object [java. lang.NoSuchMethodException :([Ljava. lang.String;)]

转载 作者:行者123 更新时间:2023-12-02 06:09:23 24 4
gpt4 key购买 nike

我有一个对象需要更新,使用以下形式来更新它。我有一个名为 createDate 的属性,我不想在更新记录时更改该属性,因此我没有将其包含在表单中,但是当我提交表单时,它会更改 的值createDate 为 null。

<s:form method="POST" autocomplete="on" action="update">
<input type="hidden" name="user.id" value="${user.id}"/>
....
</s:form>

代码

final Session session = HibernateUtil.getSession();
try {
final Transaction tx = session.beginTransaction();
try {
session.update(user);
if (!tx.wasCommitted()) {
tx.commit();
}
return "SUCCESS";
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
return "Failed";
}
} finally {
HibernateUtil.closeSession();
}

用户类别

....
@Column(name = "createdate")
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
public Date getCreateDate() {
return createDate;
}

public void setCreateDate(Date createDate) {
this.createDate = createDate;
}

我认为它将值更改为 null 因为该字段尚未包含在表单中,因此我将以下代码添加到我的表单中,尽管页面的 HTML 源代码显示了正确的值createDate 但是当我提交表单时它会抛出以下异常。

<input type="hidden" name="user.createDate" value="${user.createDate}"/>

为 createDate 添加隐藏的输入后出现异常

INFO:   2014-02-26 12:37:25,896 -  WARN [CommonsLogger.java:60] ognl.MethodFailedException: Method "setCreateDate" failed for object com.myproject.myclasses.User@2d680c36 [java.lang.NoSuchMethodException: com.myproject.myclasses.User.setCreateDate([Ljava.lang.String;)]
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1305)
at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1494)
at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:85)
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:162)
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:27)
......

最佳答案

您面临的问题似乎与 setCreateDate() 所期望的参数有关。由于您的方法声明为 setCreateDate(Date),因此它与 setCreateDate(String) 不兼容,后者预计在您提交表单时调用。

为了更新当前模型对象,您必须使用提交的Id从数据库检索它,更新相关字段,然后调用session.update()。您的代码将如下所示

public void updateUserInfo(User user) {
Session s = getSession();
Transaction t = s.beginTransaction();
User u = (User) s.load(User.class, user.getId());
u.setAddress(user.getAddress());
u.setEmail(user.getEmail());
s.update(u);
t.commit();
closeSession();
}

有关在持久化实体之前更新字段的 Hibernate 监听器的更多信息。如果您想在保留记录之前设置 createDate 字段,您可以使用

@PrePersist
protected void onCreate() {
createDate = new Date();
}

@PrePersist@PreUpdate注释的方法分别在Hibernate第一次持久化实体或更新实体之前调用。您可以获取更多信息here .

编辑:我注意到您正在使用 Hibernate 的 Session API。在这种情况下,上面的建议就行不通了。为了让它与您当前的实现一起工作,您应该使用 Hibernate events API .

首先,为必须在持久化之前更新的对象创建一个接口(interface)(类似这样)

public interface Dateable {

void setCreateDate(Date date);
}

修改您的 User 类以实现该接口(interface)。

public class User implements Dateable {
//...
}

然后创建一个 Listener 来监听 Dateable 实体上的 SaveOrUpdateEvent 并修改 create 属性:

import org.hibernate.event.SaveOrUpdateEvent;
import org.hibernate.event.def.DefaultSaveOrUpdateEventListener;

public class SaveOrUpdateDateListener extends DefaultSaveOrUpdateEventListener {

@Override
public void onSaveOrUpdate(SaveOrUpdateEvent event) {
if (event.getObject() instanceof Dateable) {
Dateable record = (Dateable) event.getObject();
record.setCreateDate(new Date());
}
super.onSaveOrUpdate(event);
}
}

最后,通过hibernate.cfg.xml配置上述监听器

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
.....
<event type="save-update">
<listener class="SaveOrUpdateDateListener"/>
</event>
</session-factory>
</hibernate-configuration>

关于java - 警告[CommonsLogger.java :60] ognl. MethodFailedException : Method failed for object [java. lang.NoSuchMethodException :([Ljava. lang.String;)],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22029798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com