Java 原因:org.springframework.data.mapping.model.MappingException:在com.common.model.EmployeeTerritory上找不到属性territoryID!-弹簧靴
我正在开发Java 原因:org.springframework.data.mapping.model.MappingException:在com.common.model.EmployeeTerritory上找不到属性territoryID!-弹簧靴,java,spring-mvc,spring-boot,Java,Spring Mvc,Spring Boot,我正在开发Spring Boot MongoDB示例。在本例中,我试图通过SpringDataMongo存储库查询获取TerritoryID,但遇到以下错误。请引导 Caused by: org.springframework.data.mapping.model.MappingException: No property territoryID found on com.common.model.EmployeeTerritory! at org.springframework.dat
Spring Boot MongoDB
示例。在本例中,我试图通过SpringDataMongo存储库查询获取TerritoryID,但遇到以下错误。请引导
Caused by: org.springframework.data.mapping.model.MappingException: No property territoryID found on com.common.model.EmployeeTerritory!
at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:236) ~[spring-data-commons-1.9.3.RELEASE.jar:na]
at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:214) ~[spring-data-commons-1.9.3.RELEASE.jar:na]
at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:202) ~[spring-data-commons-1.9.3.RELEASE.jar:na]
at org.springframework.data.mongodb.repository.query.MongoQueryCreator.create(MongoQueryCreator.java:109) ~[spring-data-mongodb-1.6.3.RELEASE.jar:na]
at org.springframework.data.mongodb.repository.query.MongoQueryCreator.create(MongoQueryCreator.java:55) ~[spring-data-mongodb-1.6.3.RELEASE.jar:na]
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:109) ~[spring-data-commons-1.9.3.RELEASE.jar:na]
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:88) ~[spring-data-commons-1.9.3.RELEASE.jar:na]
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:73) ~[spring-data-commons-1.9.3.RELEASE.jar:na]
at org.springframework.data.mongodb.repository.query.PartTreeMongoQuery.createQuery(PartTreeMongoQuery.java:75) ~[spring-data-mongodb-1.6.3.RELEASE.jar:na]
at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.execute(AbstractMongoQuery.java:86) ~[spring-data-mongodb-1.6.3.RELEASE.jar:na]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:415) ~[spring-data-commons-1.9.3.RELEASE.jar:na]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:393) ~[spring-data-commons-1.9.3.RELEASE.jar:na]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$DefaultMethodInvokingMethodInterceptor.invoke(RepositoryFactorySupport.java:506) ~[spring-data-commons-1.9.3.RELEASE.jar:na]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) ~[spring-aop-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at com.sun.proxy.$Proxy35.findByTerritoryID(Unknown Source) ~[na:na]
at com.common.service.EmployeeTerritoryServiceImpl.findByTerritoryID(EmployeeTerritoryServiceImpl.java:18) ~[classes/:na]
at com.common.main.MainController.run(MainController.java:51) ~[classes/:na]
at org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:672) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE]
... 5 common frames omitted
16-03-22 22:33:38 [main] INFO o.s.c.a.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@576d5deb: startup date [Tue Mar 22 22:33:26 IST 2016]; root of context hierarchy
16-03-22 22:33:38 [main] INFO o.s.j.e.a.AnnotationMBeanExporter - Unregistering JMX-exposed beans on shutdown
Exception in thread "main" java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:675)
at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:690)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:321)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.common.main.Main.main(Main.java:17)
我开发的代码:
EmployeeTerritory.java
@Document(collection="employee-territories")
public class EmployeeTerritory {
@Id
private ObjectId id;
@Field
private String EmployeeID;
@Field(value="TerritoryID")
private Integer TerritoryID;
// setters and getters
}
public interface EmployeeTerritoryRepository extends CrudRepository<EmployeeTerritory, String>{
EmployeeTerritory findByTerritoryID(Integer territoryID);
}
EmployeeTerritoryRepository.java
@Document(collection="employee-territories")
public class EmployeeTerritory {
@Id
private ObjectId id;
@Field
private String EmployeeID;
@Field(value="TerritoryID")
private Integer TerritoryID;
// setters and getters
}
public interface EmployeeTerritoryRepository extends CrudRepository<EmployeeTerritory, String>{
EmployeeTerritory findByTerritoryID(Integer territoryID);
}
EmployeeTerritoryServiceImpl.java
@Component
public class EmployeeTerritoryServiceImpl implements EmployeeTerritoryService{
@Autowired
private EmployeeTerritoryRepository employeeTerritoryRepository;
@Override
public EmployeeTerritory findByTerritoryID(Integer territoryID) {
EmployeeTerritory et = employeeTerritoryRepository.findByTerritoryID(territoryID);
return et;
}
}
MainController.java
@Controller
public class MainController implements CommandLineRunner {
private Logger LOGGER = Logger.getLogger(MainController.class);
@Autowired
private EmployeeTerritoryService etService;
@Override
public void run(String... args) throws Exception {
LOGGER.info("~~ STARTED ~~");
// Find employee-territories
EmployeeTerritory et = etService.findByTerritoryID(19713);
LOGGER.info("~~~~~~~~~~~~~~~~~~~~~~~~");
LOGGER.info("EmployeeID : "+et.getEmployeeID());
LOGGER.info("TerritoryID : "+et.getTerritoryID());
}
}
Main.java
@Configuration
@EnableAutoConfiguration
@EnableMongoRepositories("com.common.repository")
@ComponentScan({"com.common.main", "com.common.service"})
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
应用程序属性
# MONGODB Config
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.uri=mongodb://localhost/boot
spring.data.mongodb.repositories.enabled=true
logging.level.com.altruista.guidingsigns=INFO
logging.level.org.springframework=INFO
数据库集合:
仅用于澄清目的。我并不认为这是一个明确的答案 也许你误解了我。您必须遵守bean的java命名约定
@Document(collection="employee-territories")
public class EmployeeTerritory {
@Id
private ObjectId id;
@Field
private String EmployeeID;
@Field(value="TerritoryID")
private Integer TerritoryID;
// setters and getters
}
应该是
@Document(collection="employee-territories")
public class EmployeeTerritory {
@Id
private ObjectId id;
@Field
private String employeeID;
@Field(value="TerritoryID")
private Integer territoryID;
// setters and getters
}
我重复一遍,这可能是您出现异常的原因。我能够解决此错误。请参阅下面我的代码片段。根据spring data mongo文件(参考第12.1.1节): 您的Mongo DB字段使用驼峰大小写字母及其各自的setter和getter,但根据doc“标识符的默认字段名为'\u id',可以通过
@field
注释进行自定义。”
如果您愿意通过任何字段获取数据,则需要对所有字段应用类似的逻辑
使用下面的,将工作
@Document(collection="employee-territories")
public class EmployeeTerritory {
@Id
private ObjectId id;
@Field("EmployeeID")
private Integer employeeID;
@Field("TerritoryID")
private Integer territoryID;
public ObjectId getId() {
return id;
}
public void setId(ObjectId id) {
this.id = id;
}
public Integer getEmployeeID() {
return employeeID;
}
public void setEmployeeID(Integer employeeID) {
this.employeeID = employeeID;
}
public Integer getTerritoryID() {
return territoryID;
}
public void setTerritoryID(Integer territoryID) {
this.territoryID = territoryID;
}
}
您是否尝试过将类中的字段命名为“territoryId”?这不是一个愚蠢的问题。使用
territoryId
并添加getter/setter(spring可能会使用它们)。对spring进行一些调试可能有助于out@RC. 奇怪的是,我们的建议最终被接受为正确答案,不是吗?@RubioRic你应该习惯它;)(如果你真的“不喜欢”,你可以否决这个答案)@javaHelper,这很奇怪。异常似乎是指模型org.springframework.data.mapping.model.MappingException。模型映射。我不相信你的评论。有人否决了我的澄清?谢谢你的回答:)什么???但这就是我45分钟前在评论中提出的解决方案!javatechnology和javaHelper都鄙视它。00