从控制器访问服务层

时间:2017-04-25 10:14:27

标签: spring rest spring-boot solr spring-data

我正在使用REST Web服务来查询来自Apache Solr的数据。我在Solr存储库中使用Spring boot +数据。 我不知道如何互连作为服务,存储库和控制器层。

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 );
    }
....
}

存储库(Spring数据)

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并访问服务层中的控制器? 如何使用rest Web服务配置solr客户端?

更新

我将spring boot版本从1.4.3升级到1.5.1并且它有效。老实说,我不明白为什么。 现在我得到另一个错误,当访问solr时,spring数据复制了solr中核心的名称。有什么想法吗?

由于

3 个答案:

答案 0 :(得分:0)

首先,如果您只有一个实现,则不需要服务接口。 您没有访问服务层中的控制器,反之亦然。控制器&gt;服务&gt;存储库(在您的情况下为solr) Controller定义了您的API,Service定义了您应该用来访问外部资源的业务层和存储库(在您的情况下为solr)

因此,在Controller中@Autowire服务,并在服务器中@Autowire存储库

答案 1 :(得分: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;
}

答案 2 :(得分:0)

找不到ImageRepository-Bean(也许你想念@EnableJpaRepositories)所以spring正在寻找一个BeanFactory并找到一个SolrRepositoryFactoryBean,它需要一个类型为(Class)的构造函数参数。通常@EnableJpaRepositories的扫描程序构造SolrRepositoryFactoryBean,但只要@EnableJpaRepositories缺失(或配置错误),就无法构造ImageRepository。

修复:

  • @EnableJpaRepositories添加到Application并配置注释的参数。