2015-11-28 36 views
1

我在春天启动应用程序使用ResourceAssemblerSupport从Spring HATEOAS春天资源汇编扔NoSuchBeanDefinitionException

我创建汇编如下图所示:

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

} 

,如下列reource类:

public class MemberResource extends ResourceSupport implements Serializable{ 
//relevant code here 
} 

域的等级如下:

@Document(collection="Member") 
public class Member { 
//relevant code here 
} 

repository类是如下:

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。所有依赖关系都是通过Spring Boot 1.3.0的启动器发布的.RELEASE

Controller类的父包中有一个Spring引导应用程序类。存储库上的Autowire注释工作正常。

+0

它没有多大意义了'MemberResourceAssembler'构造函数需要摆在首位的论点。 – zeroflagL

回答

0

我加在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); 
    } 
} 
1

您的MemberResourceAssembler应注明为@Component以使其可用于自动装配。

+0

添加@Component给我一个异常说“没有默认构造函数找到”,当我尝试添加一个默认构造函数编译器给我“隐式超级构造函数ResourceAssemblerSupport <成员,MemberResource>()是未定义的必须显式调用另一个构造函数” –

+0

After你添加了@ @ Component注解,Spring实际上试图在第一次实例化你的类,这样就可以。之后,你添加了一个默认的构造函数,这也是可以的。最后一步应该是用你自己的默认构造函数调用超级构造函数:'super(MemberController.class,MemberResource.class);' –