2017-04-25 3 views
0

Ich verwende einen REST-Webdienst, der Daten von Apache Solr abfragt. Ich verwende Spring Boot + Daten mit Solr-Repositories. Ich weiß nicht, wie man als Service-, Repository- und Controller-Layer verschaltet.Greifen Sie über den Controller auf die Serviceebene zu

I have the following structure

-Controller:

@RestController 
public class ImageSearchController { 

    private final Logger log = LoggerFactory.getLogger(this.getClass()); 
    @Resource ImageService imageService; 
.... 
} 

Main nach SpringBootApplication:

@SpringBootApplication 
public class Application extends SpringBootServletInitializer{ 

    public static void main(String[ ] args) { 
     SpringApplication.run(Application.class , args); 
    } 

} 

Dienst:

public interface ImageService { 

    List<Image> searchTerm(String searchTerm); 
    List<Image> search(String imgSrc , String imgTitle); 
    List<Image> searchByImgSrc(String searchTerm); 
    List<Image> findAll(); 
} 

Dienst Impl:

@Service 
public class ImageServiceImpl implements ImageService { 

    @Resource 
    private ImageRepository repository; 


    @Override 
    public List<Image> search(String imgSrc , String imgTitle) { 
     return repository.findByImgSrcContainsOrImgTitleContains(imgSrc , imgTitle); 
    } 
.... 
} 

Repository (Spring Data):

public interface ImageRepository extends SolrCrudRepository< Image , String > { 

    public List<Image> findAll(); 

... 
} 

pom.xml:

<dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <!-- https://mvnrepository.com/artifact/org.apache.solr/solr-solrj --> 
     <dependency> 
      <groupId>org.apache.solr</groupId> 
      <artifactId>solr-solrj</artifactId> 
      <version>5.1.0</version> 
     </dependency> 
     <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-solr --> 
     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-solr</artifactId> 
      <version>2.1.1.RELEASE</version> 
     </dependency> 
    </dependencies> 
... 

    <repositories> 
     <repository> 
      <id>spring-releases</id> 
      <url>https://repo.spring.io/libs-release</url> 
     </repository> 
     <repository> 
      <id>spring-milestone</id> 
      <name>Spring Milestone Maven Repository</name> 
      <url>http://repo.springsource.org/libs-milestone</url> 
     </repository> 
    </repositories> 

Logs of application

Wie erstellt man die Bean und greift auf den Controller in der Serviceebene zu? Wie konfiguriert man den Solr Client mit dem Rest Web Service?

UPDATE

Ich verbesserte die Feder Boot-Version von 1.4.3 bis 1.5.1 und es funktionierte. Ehrlich, ich verstehe nicht warum. Jetzt bekomme ich einen weiteren Fehler, wenn man auf solr zugreift, duplizieren die Quelldaten den Namen des Kerns in solr. Irgendeine Idee ?

Dank

+0

bearbeiten: Pom-Datei hinzufügen – alves

Antwort

0

1. Sie die Service-Schnittstelle nicht benötigen, wenn Sie nur eine Implementierung haben. Sie greifen nicht auf den Controller in der Serviceebene zu, es ist umgekehrt. Controller> Service> Repository (solr in Ihrem Fall) Controller definiert Ihre API-Service definiert Ihre Business-Schicht und Repository sollten Sie externe Ressourcen (solr in Ihrem Fall)

So im Controller Sie @Autowire den Dienst zuzugreifen verwenden und in der serice Sie @Autowire das Repository

+0

Ja, ich habe die Idee. Aber ich kann es nicht implementieren. Geben Sie mir den Fehler, den ich im vorherigen Post beschrieben habe. Ich weiß nicht, wie ich AppConfig mit dem Controller und den übrigen Layern verbinden soll. – alves

0

Zuerst sollten Sie inject your dependencies. Ich empfehle Konstruktor Injektion. In Ihrem Fall:

@Service 
public class ImageServiceImpl implements ImageService { 

private final ImageRepository repository; 

@Autowired // no necessary in spring 4.3+ 
public ImageServiceImpl(ImageRepository repository) { 
    this.repository = repository; 
} 
+0

Ok danke für die Antwort, aber ich bekomme weiterhin die selbe Ausnahme: UnbefriedigteDependenzException: Fehler beim Erstellen von Bean mit dem Namen 'imageSearchController' in der Datei definiert ... 'imageServiceImpl' in der Datei definiert .. Fehler beim Erstellen Bean mit dem Namen 'imageRepository': Unzufrieden Abhängigkeit ausgedrückt durch den Konstruktorparameter 0; verschachtelte Ausnahme ist NoSuchBeanDefinitionException: Kein qualifizierendes Bean des Typs 'java.lang.Class >' verfügbar: erwartet mindestens 1 Bean, die sich als Autowire-Kandidat qualifiziert. Abhängigkeitsanmerkungen: {} – alves

+0

Versuchen Sie, ImageRepository mit @Repository zu kommentieren – sovas

+0

bearbeiten Sie Beitrag mit neuen Informationen – alves

0

Die ImageRepository-Bean konnte nicht gefunden werden (Vielleicht vermissen Sie @EnableJpaRepositories), so ist Feder für einen BeanFactory sucht und findet einen SolrRepositoryFactoryBean, die einen Konstruktor-Parameter vom Typ (Klasse) erfordert.Normalerweise erstellt ein Scanner von @EnableJpaRepositories die SolrRepositoryFactoryBean, aber solange @EnableJpaRepositories fehlt (oder falsch konfiguriert), konnte das ImageRepository nicht erstellt werden.

Der Fix:

  • hinzufügen @EnableJpaRepositories zum Application und die Parameter der Anmerkung konfigurieren.
Verwandte Themen