2015-11-28 71 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);' –