我正在使用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>
如何创建bean并访问服务层中的控制器? 如何使用rest Web服务配置solr客户端?
更新
我将spring boot版本从1.4.3升级到1.5.1并且它有效。老实说,我不明白为什么。 现在我得到另一个错误,当访问solr时,spring数据复制了solr中核心的名称。有什么想法吗?
由于
答案 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
并配置注释的参数。