gpt4 book ai didi

spring - MongoDB - 考虑在您的配置中定义类型为 'org.springframework.data.mongodb.repository.query.MongoEntityInformation' 的 bean

转载 作者:行者123 更新时间:2023-12-05 07:39:03 28 4
gpt4 key购买 nike

我的Student实体类

package com.example.entity;

import java.io.Serializable;

import javax.persistence.Id;

import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "student")
public class StudentMongo implements Serializable {

private static final long serialVersionUID = 8764013757545132519L;

@Id
private Long id;

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Long getId() {
return id;
}

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

}

我的仓库

package com.example.repository;

import javax.annotation.Resource;

import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
import org.springframework.stereotype.Repository;

import com.example.entity.StudentMongo;

@Repository
public class StudentMongoRepository extends SimpleMongoRepository<StudentMongo, Long> {

@Resource
MongoOperations mongoOperations;


public StudentMongoRepository(MongoEntityInformation<StudentMongo, Long> metadata, MongoOperations mongoOperations) {
super(metadata, mongoOperations);
}

}

我的配置类

@Configuration
@EnableMongoRepositories(basePackageClasses = {com.example.repository.StudentMongoRepository.class})
public class MongoConfiguration {

}

Spring 启动应用

当我尝试启动应用程序时,我得到了以下应用程序

2017-11-20 09:04:48.937 ERROR 23220 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.example.repository.StudentMongoRepository required a bean of type 'org.springframework.data.mongodb.repository.query.MongoEntityInformation' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.data.mongodb.repository.query.MongoEntityInformation' in your configuration.

考虑在您的配置中定义类型为“org.springframework.data.mongodb.repository.query.MongoEntityInformation”的 bean如何按照 spring 框架的说法创建 EntityInformation bean运行我的应用程序时出现上述问题。如何传递实体信息

建议我如何使用 SimpleMongorepository

最佳答案

我遇到了同样的问题,我解决了外部化 Spring Data 的 MongoEntityInformationSupport

这样做:

创建这三个类:

public final class MongoEntityInformationSupport {

private MongoEntityInformationSupport() {}

/**
* Factory method for creating {@link MongoEntityInformation}.
*
* @param entity must not be {@literal null}.
* @param idType can be {@literal null}.
* @return never {@literal null}.
*/
@SuppressWarnings("unchecked")
public static <T, ID> MongoEntityInformation<T, ID> entityInformationFor(MongoPersistentEntity<?> entity,
@Nullable Class<?> idType) {

Assert.notNull(entity, "Entity must not be null!");

MappingMongoEntityInformation<T, ID> entityInformation = new MappingMongoEntityInformation<T, ID>(
(MongoPersistentEntity<T>) entity, (Class<ID>) idType);

return ClassUtils.isAssignable(Persistable.class, entity.getType())
? new PersistableMongoEntityInformation<T, ID>(entityInformation) : entityInformation;
}
}

Ps.: 把PersistableMongoEntityInformationMongoEntityInformationSupport放在同一个包里

@RequiredArgsConstructor //<-- Lombok
class PersistableMongoEntityInformation<T, ID> implements MongoEntityInformation<T, ID> {

private final @NonNull
MongoEntityInformation<T, ID> delegate;

/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.repository.MongoEntityInformation#getCollectionName()
*/
@Override
public String getCollectionName() {
return delegate.getCollectionName();
}

/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.repository.MongoEntityInformation#getIdAttribute()
*/
@Override
public String getIdAttribute() {
return delegate.getIdAttribute();
}

/*
* (non-Javadoc)
* @see org.springframework.data.repository.core.EntityInformation#isNew(java.lang.Object)
*/
@Override
@SuppressWarnings("unchecked")
public boolean isNew(T t) {

if (t instanceof Persistable) {
return ((Persistable<ID>) t).isNew();
}

return delegate.isNew(t);
}

/*
* (non-Javadoc)
* @see org.springframework.data.repository.core.EntityInformation#getId(java.lang.Object)
*/
@Override
@SuppressWarnings("unchecked")
public ID getId(T t) {

if (t instanceof Persistable) {
return ((Persistable<ID>) t).getId();
}

return delegate.getId(t);
}

/*
* (non-Javadoc)
* @see org.springframework.data.repository.core.support.PersistentEntityInformation#getIdType()
*/
@Override
public Class<ID> getIdType() {
return delegate.getIdType();
}

/*
* (non-Javadoc)
* @see org.springframework.data.repository.core.support.EntityMetadata#getJavaType()
*/
@Override
public Class<T> getJavaType() {
return delegate.getJavaType();
}
}

我创建这个 MongoHelper 只是为了简化

public class MongoHelper {
public static MongoEntityInformation getEntityInformationFor(Class clazz, Class idClazz) {
TypeInformation typeInformation = ClassTypeInformation.from(clazz);
MongoPersistentEntity mongoPersistentEntity = new BasicMongoPersistentEntity(typeInformation);
return MongoEntityInformationSupport.entityInformationFor(mongoPersistentEntity, idClazz);
}
}

最后

您可以像这样使用(带有 QuerydslMongoPredicateExecutor 的示例):

public class TicketRepositoryCustomImpl extends QuerydslMongoPredicateExecutor<Ticket> implements TicketRepositoryCustom {

//The MongoOperations will be autowired
public TicketRepositoryCustomImpl(MongoOperations mongoOperations) {
super(MongoHelper.getEntityInformationFor(Ticket.class, String.class), mongoOperations);
}

@Override
public Optional<Ticket> findWithFilter(TicketFilter filter) {
BooleanBuilder builder = new BooleanBuilder();
//populate the builder
return findOne(builder.getValue());
}
}

关于spring - MongoDB - 考虑在您的配置中定义类型为 'org.springframework.data.mongodb.repository.query.MongoEntityInformation' 的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47384779/

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