java - OnBeforeSave 被调用但没有任何反应

标签 java spring mongodb spring-data event-listener

我正在尝试检查我要保留的对象是否已经有一个“所有者”,如果没有,我将设置登录用户。此 EventListener 适用于 Contact 的任何其他字段,并且在我调试时它确实设置了用户。 MongoRepository 保存方法的返回值包含正确的设置用户,但当我查看数据库时,用户未保存。

OwnedByUserMongoEventListener 类

public void onBeforeSave(BeforeSaveEvent<Contact> event) {
    Contact source = event.getSource();
    ReflectionUtils.doWithFields(source.getClass(), new OwnedByUserCallback(source));
}

OwnedByUserCallback 类

@Override
public void doWith(java.lang.reflect.Field field) throws IllegalArgumentException, IllegalAccessException {
    ReflectionUtils.makeAccessible(field);
    final Object fieldValue = field.get(getSource());
    if (field.isAnnotationPresent(OwnedByUser.class)) {
        if ( fieldValue == null ) {
            JwtUser principal = (JwtUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            User user = mongoOperations.findOne(Query.query(Criteria.where("username").is(principal.getUsername())), User.class);
            field.set(getSource(), user);
        }
    }

}

/

Contact extends Auditable {

    @Id
    private String id;

    @Indexed(unique=true,sparse=true)
    @NotNull
    private Long seqId;

    private BasicDBObject attributes = new BasicDBObject(new HashMap<>());

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @SuppressWarnings("unchecked")
    public Map<String, Object> getAttributes() {
        return attributes.toMap();
    }

    public void setAttributes(Map<String, Object> attributes) {
        this.attributes = new BasicDBObject(attributes);
    }

    public String toString() {
        return "ID: "+getId() +" Attributes: " + getAttributes();
    }

    public Long getSeqId() {
        return seqId;
    }

    public void setSeqId(Long seqId) {
        this.seqId = seqId;
    }

}



public abstract class Auditable {

    @CreatedDate
    private Date createdDate;

    @DBRef
    @CreatedBy
    private User createdBy;

    @DBRef
    @OwnedByUser
    private User owner;

    @LastModifiedDate
    private Date updatedDate;

    @DBRef
    @LastModifiedBy
    private User updatedBy;

    public Date getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

    public User getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(User createdBy) {
        this.createdBy = createdBy;
    }

    public Date getUpdatedDate() {
        return updatedDate;
    }

    public void setUpdatedDate(Date updatedDate) {
        this.updatedDate = updatedDate;
    }

    public User getUpdatedBy() {
        return updatedBy;
    }

    public void setUpdatedBy(User updatedBy) {
        this.updatedBy = updatedBy;
    }

    public User getOwner() {
        return owner;
    }

    public void setOwner(User owner) {
        this.owner = owner;
    }

}

最佳答案

我正在尝试使用 OnBeforeSave,但在调用 MongoConverter 后无法更改属性,除非更改 event.getDBObject()。如果您想使用您的类 Object 进行更改,那么您需要使用 OnBeforeConvert ...由于文档不完善,我花了很多时间来跟踪它...

关于java - OnBeforeSave 被调用但没有任何反应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49536371/

相关文章:

node.js - 如何在 Meteor 中定义嵌套数组的模式?

java - 如何查看个人域用户登录情况

java - Java 中的线程。在新线程中创建每个图形,循环不起作用

java - 如何在java spring中运行预定的作业?

java - Angular 和 spring boot 没有绑定(bind)在一起,所以它们在同一个端口 8080 上运行

node.js - 使用 Node + Jade + Express 渲染存储在 Mongo (GridFS) 中的图像

node.js - 如何在 Mongoose 中使用自定义类型?

java - 使用 Java 发送 POST 数据

java - 面向对象设计 : generic handling of sub classes that introduce new fields

java - Spring MVC 返回 HTTP 406 响应