2014-09-23 41 views
1

我正在用mongodb构建一个spring webapp,但最近我开始写数据库时遇到问题。以下堆栈跟踪是我得到的。写数据库时,Spring-Data-Mongodb NoSuchMethodError

SEVERE: Servlet.service() for servlet [DispatcherServlet] in context with path [/afcrowther_blog]  threw exception [Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.springframework.data.mongodb.core.mapping.MongoPersistentProperty.isWritable()Z] with root cause 
java.lang.NoSuchMethodError:  org.springframework.data.mongodb.core.mapping.MongoPersistentProperty.isWritable()Z 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$3.doWithPersistentProperty(MappingMongoConverter.java:415) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$3.doWithPersistentProperty(MappingMongoConverter.java:412) 
at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:294) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:412) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:386) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.write(MappingMongoConverter.java:350) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.write(MappingMongoConverter.java:77) 
at org.springframework.data.mongodb.core.MongoTemplate.toDbObject(MongoTemplate.java:732) 
at org.springframework.data.mongodb.core.MongoTemplate.doInsert(MongoTemplate.java:714) 
at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:672) 
at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:663) 

读了这最常见的原因后,似乎是依赖不匹配,但我不知道它的依赖性与在这种情况下彼此实际上是兼容的。

的pom.xml

<spring.version>4.0.7.RELEASE</spring.version> 
    <jackson.version>1.9.2</jackson.version> 
    <spring.security.version>3.2.5.RELEASE</spring.security.version> 

</properties> 

<dependencies> 

    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.mongodb</groupId> 
     <artifactId>mongo-java-driver</artifactId> 
     <version>2.12.3</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>cglib</groupId> 
     <artifactId>cglib</artifactId> 
     <version>3.1</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-mongodb</artifactId> 
     <version>1.6.0.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-commons</artifactId> 
     <version>1.9.0.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-oxm</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
     <scope>provided</scope> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.1.2</version> 
    </dependency> 

    <dependency> 
     <groupId>taglibs</groupId> 
     <artifactId>standard</artifactId> 
     <version>1.1.2</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
     <scope>provided</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>${jackson.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>4.2.0.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-web</artifactId> 
     <version>${spring.security.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
     <version>${spring.security.version}</version> 
    </dependency> 

</dependencies> 

<repositories> 
    <repository> 
     <id>spring-libs-snapshot</id> 
     <name>Spring Snapshot Repository</name> 
     <url>http://repo.spring.io/libs-snapshot</url> 
    </repository> 
</repositories> 

<build> 

    <finalName>afcrowther blog</finalName> 

    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-eclipse-plugin</artifactId> 
      <version>2.9</version> 
      <configuration> 
       <downloadSources>true</downloadSources> 
       <downloadJavadocs>true</downloadJavadocs> 
      </configuration> 
     </plugin> 
    </plugins> 

</build> 

这些主要的最新发行版本,虽然我改变了Spring框架4.0.7.Release,试图修复它,但我也用4.1.0.Release并发生同样的异常。

感谢

编辑:@Document注解类抛出错误,角色设置为一个字符串,直到这一问题得到解决

@Document(collection = "user") 
public class UserModel{ 

@PersistenceConstructor 
public UserModel(String id, String firstName, String surname, String email, 
     String password, String role) { 
    this.id = id; 
    this.firstName = firstName; 
    this.surname = surname; 
    this.email = email; 
    this.password = password; 
    this.role = role; 
} 

public UserModel(){ 

} 

@Id 
private String id; 

@Field("firstName") 
@Indexed 
private String firstName; 

@Field("surname") 
private String surname; 

@Field("email") 
@Indexed(unique = true) 
private String email; 

@Field("password") 
private String password; 

@Field("role") 
private String role; 

public String getId() { 
    return id; 
} 

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

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getSurname() { 
    return surname; 
} 

public void setSurname(String surname) { 
    this.surname = surname; 
} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public String getRole(){ 
    return role; 
} 

public void setRole(String role){ 
    this.role = role; 
} 
} 
+1

我很确定你在'@ Document'注释类中缺少一个setter。 – 2014-09-23 10:39:46

+0

粘贴课程,任何跳动的内容不正确?谢谢 – afcrowther 2014-09-23 10:51:40

+0

你可以运行'dependency:resolve'吗?有问题的方法是在Commons 1.9.0中添加的,它可能是一些传递性依赖使Maven pull成为旧版本。 – chrylis 2014-09-23 11:30:54

回答

0

更新的问题,一旦转到春天BOM和春季数据依赖关系管理,问题依然存在。

但是,从第一个构造函数中除去“@PersistenceConstructor”标记,然后切换构造函数的顺序来解决问题。所以默认的构造函数必须是文件中的第一个。不知道为什么,但你去了!