Spring 资源组装器抛出 NoSuchBeanDefinitionException
Spring Resource Assembler throwing NoSuchBeanDefinitionException
我在 spring 启动应用程序中使用 spring-hateoas 的 ResourceAssemblerSupport
我创建了如下的汇编程序:
public class MemberResourceAssembler extends ResourceAssemblerSupport<Member, MemberResource>{
public MemberResourceAssembler(Class<?> controllerClass, Class<MemberResource> resourceType) {
super(controllerClass, resourceType);
}
@Override
public MemberResource toResource(Member member) {
MemberResource memberResource=new MemberResource();
memberResource.setStatus(member.getStatus());
memberResource.setHeight(member.getHeight());
memberResource.setIs_veg(member.getIs_veg());
memberResource.setRace(member.getRace());
memberResource.setWeight(member.getWeight());
return memberResource;
}
}
资源 class 如下:
public class MemberResource extends ResourceSupport implements Serializable{
//relevant code here
}
域名class如下:
@Document(collection="Member")
public class Member {
//relevant code here
}
仓库class如下:
public interface MemberRepository extends PagingAndSortingRepository<Member,Integer> {
Page<Member> findByStatusContainsIgnoreCase(@Param("q") String status, Pageable pageable);
}
现在我正尝试在我的控制器中使用如下:
@RestController
@RequestMapping("/members")
public class MemberController {
@Autowired
private MemberRepository memberRepository;
@Autowired
private MemberResourceAssembler assembler;
@RequestMapping(value = "/search", method = RequestMethod.GET)
public PagedResources<MemberResource> search(@RequestParam("status") String status, @PageableDefault Pageable pageable,
PagedResourcesAssembler<Member> pagedAssembler) {
Page<Member> members = memberRepository.findByStatusContainsIgnoreCase(status, pageable);
return pagedAssembler.toResource(members, assembler);
}
}
我遇到以下异常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.sg.resources.MemberResourceAssembler] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
使用 spring-hateoas 版本 0.19.0.RELEASE.All 依赖项来自 Spring Boot 1.3.0.RELEASE
Controller 的父包中有一个 spring 引导应用程序 class class.The 存储库上的 Autowire 注释工作正常。
您的 MemberResourceAssembler
应注释为 @Component
以使其可用于自动装配。
我在 Application.class 中添加了一个 bean 定义,解决了这个问题
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public MemberResourceAssembler memberResourceAssembler() {
return new MemberResourceAssembler(MemberController.class, MemberResource.class);
}
}
我在 spring 启动应用程序中使用 spring-hateoas 的 ResourceAssemblerSupport
我创建了如下的汇编程序:
public class MemberResourceAssembler extends ResourceAssemblerSupport<Member, MemberResource>{
public MemberResourceAssembler(Class<?> controllerClass, Class<MemberResource> resourceType) {
super(controllerClass, resourceType);
}
@Override
public MemberResource toResource(Member member) {
MemberResource memberResource=new MemberResource();
memberResource.setStatus(member.getStatus());
memberResource.setHeight(member.getHeight());
memberResource.setIs_veg(member.getIs_veg());
memberResource.setRace(member.getRace());
memberResource.setWeight(member.getWeight());
return memberResource;
}
}
资源 class 如下:
public class MemberResource extends ResourceSupport implements Serializable{
//relevant code here
}
域名class如下:
@Document(collection="Member")
public class Member {
//relevant code here
}
仓库class如下:
public interface MemberRepository extends PagingAndSortingRepository<Member,Integer> {
Page<Member> findByStatusContainsIgnoreCase(@Param("q") String status, Pageable pageable);
}
现在我正尝试在我的控制器中使用如下:
@RestController
@RequestMapping("/members")
public class MemberController {
@Autowired
private MemberRepository memberRepository;
@Autowired
private MemberResourceAssembler assembler;
@RequestMapping(value = "/search", method = RequestMethod.GET)
public PagedResources<MemberResource> search(@RequestParam("status") String status, @PageableDefault Pageable pageable,
PagedResourcesAssembler<Member> pagedAssembler) {
Page<Member> members = memberRepository.findByStatusContainsIgnoreCase(status, pageable);
return pagedAssembler.toResource(members, assembler);
}
}
我遇到以下异常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.sg.resources.MemberResourceAssembler] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
使用 spring-hateoas 版本 0.19.0.RELEASE.All 依赖项来自 Spring Boot 1.3.0.RELEASE
Controller 的父包中有一个 spring 引导应用程序 class class.The 存储库上的 Autowire 注释工作正常。
您的 MemberResourceAssembler
应注释为 @Component
以使其可用于自动装配。
我在 Application.class 中添加了一个 bean 定义,解决了这个问题
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public MemberResourceAssembler memberResourceAssembler() {
return new MemberResourceAssembler(MemberController.class, MemberResource.class);
}
}