2017-04-25 223 views
0

我正在使用從Apache Solr查詢數據的REST Web服務。我正在使用Spring引導+數據與Solr存儲庫。 我不知道如何互連作爲服務,存儲庫和控制器層。從控制器訪問服務層

I have the following structure

控制器

@RestController 
public class ImageSearchController { 

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

主到SpringBootApplication

@SpringBootApplication 
public class Application extends SpringBootServletInitializer{ 

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

} 

服務

public interface ImageService { 

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

服務默認地將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); 
    } 
.... 
} 

庫(春數據)

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

如何創建bean並訪問服務層中的控制器? 如何使用其他Web服務配置solr客戶端?

UPDATE

我升級從1.4.3春天引導版本爲1.5.1,它的工作。老實說,我不明白爲什麼。 現在我得到另一個錯誤,當訪問solr時,spring數據複製solr中的核心名稱。任何想法 ?

謝謝

+0

編輯:添加pom文件 – alves

回答

0

1如果您只有一個實現,則不需要服務接口。 您不會訪問服務層中的控制器。控制器>服務>庫(在你的情況SOLR)是 控制器定義你的API,服務定義你的業務層和存儲庫,你應該使用訪問外部資源(在你的情況SOLR)是

所以在控制你@Autowire服務並在您的服務@Autowire存儲庫

+0

是的,我明白了。但我無法實現它..給我在前面的文章中描述的錯誤。我不知道如何將AppConfig與控制器和其餘層互連。 – alves

0

首先,你應該inject your dependencies。我推薦構造函數注入。你的情況:

@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

好的謝謝你的答案,但我繼續收到相同的異常:UnsatisfiedDependencyException:創建名爲'imageSearchController'的文件中定義的名爲'imageServiceImpl'的文件中定義的錯誤..創建名爲'imageRepository'的bean時出錯:不滿意通過構造函數參數0表示的依賴關係;嵌套異常是NoSuchBeanDefinitionException:沒有類型爲'java.lang.Class >'的合格bean可用:預計至少有1個符合自動連線候選者的bean。依賴註釋:{} – alves

+0

嘗試使用@Repository標記ImageRepository – sovas

+0

編輯帖子以新信息 – alves

0

的ImageRepository豆找不到(也許你錯過@EnableJpaRepositories),所以春天正在尋找一個BeanFactory並且發現SolrRepositoryFactoryBean需要的類型(類)的構造函數參數。通常@EnableJpaRepositories的掃描器構造SolrRepositoryFactoryBean,但只要@EnableJpaRepositories丟失(或配置錯誤)ImageRepository無法構建。

解決方法:

  • 添加@EnableJpaRepositoriesApplication和配置註釋的參數。