2017-04-25 151 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和配置注释的参数。