2016-04-02 14 views
2

Ich habe die folgende Entitätsklasse, die vor dem Erstellen eines Objekts die getUniqueSlug-Methode aufrufen sollte, um zu überprüfen, ob bereits Elemente mit demselben Namen vorhanden sind.Spring Entity Autowired Repository Nullzeiger

@Entity public class Category { 
@Column private Long id; 

@Column(nullable = false) private String name; 

@Column(nullable = false) private String slug; 

@Autowired private CategoryRepository categoryRepository; 

public String getUniqueSlug(String name) { 
    int i = 1; 

    while (this.categoryRepository.findBySlug(Slug.toSlug(name)) != null) { 
     name = name + " " + i; 
     i++; 
    } 

    return Slug.toSlug(name); 
} 

// Constructors 

public Category() { 
} 

public Category(String name) { 
    this.name = name; 
    this.slug = getUniqueSlug(name); 
} 

// Getters and setters 

Ich habe auch den folgenden Test zu überprüfen, ob sie es richtig funktioniert:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@WebAppConfiguration public class CategoryTest { 

private MockMvc mockMvc; 

@Autowired private CategoryRepository categoryRepository; 

@Autowired ObjectMapper objectMapper; 

@Autowired private WebApplicationContext webApplicationContext; 

@Before public void setUp() throws Exception { 
    this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 

    this.categoryRepository.deleteAll(); 
    this.categoryRepository.save(new Category("My category name")); 
} 

@Test public void testUniqueSlug() throws Exception { 
    String slug = "My category name"; 
    int integer = 1; 
    while (categoryRepository.findBySlug(Slug.toSlug(slug)) != null) { 
     slug = slug + " " + integer; 
     integer++; 
    } 
    this.categoryRepository.save(new Category(slug)); 
    System.out.println(this.categoryRepository.findAll()); 
} 

Wenn ich diesen Test ausführen, bekomme ich die NullPointerException, so nehme ich an, dass das Problem irgendwo ist die in autowiring Repository in der Category Klasse. Wo genau?

+1

Das Duplikat erklärt, was das Kernproblem ist, aber es ist eine schlechte Form, das Datenobjekt mit Dienstabhängigkeiten, insbesondere verborgenen, zu mischen. Wenn Sie Ihre Slug-Logik * auf diese Weise * implementieren müssen, übergeben Sie das 'CategoryRepository' als Parameter an die Generatormethode. – chrylis

Antwort

0

müssen Sie nicht Frühling Bohnen in Entitätsklasse verwenden, da Feder nicht Entität verwalten CLASES so nicht autowired private CategoryRepository categoryRepository; diese Linie alle Zeit Wurf Null-Zeiger Ausnahme

1

Sie sollten alle Methoden von Entitätsklasse trennen nach MVC-Konzept. Alle Methoden befinden sich in der Service-Klasse mit dem Autowired-Repository. Überprüfen Sie außerdem, ob der Anwendungskontext Ihre Repository-Bean enthält.

Verwandte Themen