2017-10-23 5 views
2

Ich habe ein Spring-Projekt und ein MongoRepository. Das MongoRepository ist ein Interface, das wie JPA das MongoRepository erweitert.Spring MongoRepository, wo die Ausnahme zu fangen?

Wenn ich versuche, mein Projekt mit mvn clean install zu erstellen, wird Spring einmal ausgeführt. Spring versucht, eine Verbindung zu MongoDB herzustellen, die nicht auf meinem Jenkins-Server ausgeführt wird.

Ausnahme = {com.mongodb.MongoSocketOpenException: Exception Öffnung Buchse}, verursacht durch {java.net.ConnectException: Connection refused: connect}

Gibt es eine Möglichkeit, die Ausnahme zu fangen? Ich kann es auf dem Dienst, wo ich mein Repository aufrufe, nicht abfangen, weil diese Methoden nicht ausgeführt werden. Ich denke, es hat etwas mit @autowire zu tun, aber ich kann nicht herausfinden, wie die Ausnahme zu fangen.

Die Architektur:

application 
    - resource (api) 
    - service 
    - repository extends MongoRepository 

Die Anwendung durchsucht das Projekt, die Ressource den Dienst aufruft, ruft der Dienst das Repository und das Repository wirft einen Fehler, weil es nicht zu MongoDB verbinden kann.

Repository:

public interface MetingRepository extends MongoRepository<Meting, String> { 
    Page<Meting> findAllByRuimteId(String ruimteId, Pageable page); 
} 

Service:

@Service("metingenService") 
public class MetingServiceImpl implements MetingService { 

    // could I try-catch this? 
    @Autowired 
    private MetingRepository metingRepository; 

    @Override 
    public Meting addMeting(Meting meting) { 
     // try-catch does not solve the issue here 
     return metingRepository.save(meting); 
    } 
    } 
} 

Der einzige Test Ich habe, automatisch generiert:

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class MetingenServiceApplicationTests { 

    @Test 
    public void contextLoads() { 

    } 

} 

Stacktrace:

org.springframework.beans.factory.UnsatisfiedDependencyException: Fehler beim Erstellen Bean mit namen 'metingResource': Unbefriedigend Abhängigkeit ausgedrückt durch Feld 'metingService'; verschachtelte Ausnahme ist org.springframework.beans.factory.UnsatisfiedDependencyException: Fehler beim Erstellen einer Bean mit dem Namen 'metingenService': Unzufriedene Abhängigkeit ausgedrückt durch Feld 'metingRepository'; verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen von Bean mit dem Namen 'metingRepository': Der Verweis auf die Bean 'mongoTemplate' kann nicht aufgelöst werden, während die Bean-Eigenschaft 'mongoOperations' festgelegt wird; Verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen der Bean mit dem Namen 'mongoTemplate' in der Klassenpfadressource [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class]: Die Bean-Instantiierung über die Factory-Methode ist fehlgeschlagen ; verschachtelte Ausnahme ist org.springframework.beans.BeanInstantiationException: Instanz [org.springframework.data.mongodb.core.MongoTemplate] konnte nicht instanziiert werden: Factory-Methode 'mongoTemplate' hat Ausnahme ausgelöst; verschachtelte Ausnahme ist org.springframework.dao.DataAccessResourceFailureException: Zeitlimit nach 30000 ms, während auf einen Server gewartet wird, der WritableServerSelector entspricht. Die Clientansicht des Clusterstatus lautet {type = UNKNOWN, servers = [{Adresse = localhost: 27017, type = UNKNOWN, state = CONNECTING, Ausnahme = {com.mongodb.MongoSocketOpenException: Exception opening socket}, verursacht durch {java.net. ConnectException: Verbindung abgelehnt: connect}}]; verschachtelte Ausnahme ist com.mongodb.MongoTimeoutException: Zeitlimit nach 30000 ms, während auf einen Server gewartet wird, der WritableServerSelector entspricht. Die Clientansicht des Clusterstatus lautet {type = UNKNOWN, servers = [{Adresse = localhost: 27017, type = UNKNOWN, state = CONNECTING, Ausnahme = {com.mongodb.MongoSocketOpenException: Exception opening socket}, verursacht durch {java.net.ConnectException: Connection refused: connect}}]

+0

Wenn Sie autowire dieses Repo optional möchten Sie @Autowired verwenden können (required = false) – Noixes

+0

@Noixes sogar mit required = false, 'mvn package' startet das Repository und versucht sich zu verbinden. Ich bin verloren, weil es keinen Sinn hat, diese Ausnahmen zu erfassen, soweit ich weiß – Randy

+0

Warum ist der mongodb-Dienst nicht erreichbar? – Noixes

Antwort

1

Ihr Komponententest versucht, den vollständigen Spring-Kontext zu laden. Daher versucht es, eine gültige MongoTemplate zu laden, um eine Verbindung zu einer MongoDB-Instanz herzustellen.

In den meisten Fällen sollten Sie nicht verwenden @SpringBootTests (die für Integrationstests ist), stattdessen können Sie einen normalen JUnit-Test machen:

@RunWith(JUnit4.class) // or @RunWith(MockitoJUnitRunner.class) 
public class MetingenServiceApplicationTests { 
    ... 
}