0

I am using ResourceAssemblerSupport from spring-hateoas in a spring boot Application

I have created the assembler like below:

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

}

And the reource class as below:

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

The domain class is as below:

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

The repository class is as below:

public interface MemberRepository extends PagingAndSortingRepository<Member,Integer> {

    Page<Member> findByStatusContainsIgnoreCase(@Param("q") String status, Pageable pageable);
}

Now I am trying to use in my controller as below:

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

}

I am getting below exception:

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

Using spring-hateoas version 0.19.0.RELEASE.All the dependencies are coming through starters of Spring Boot 1.3.0.RELEASE

There is a spring boot Application class in the parent package of the Controller class.The Autowire annotation on the repository is working properly.

Arghya Sadhu
  • 41,002
  • 9
  • 78
  • 107

2 Answers2

1

Your MemberResourceAssembler should be annotated as @Component to make it available for autowiring.

Gergely Bacso
  • 14,243
  • 2
  • 44
  • 64
  • Adding @Component gives me an exception saying "No default constructor found" and when I try to add a default constructor compiler gives me "Implicit super constructor ResourceAssemblerSupport() is undefined. Must explicitly invoke another constructor" – Arghya Sadhu Nov 28 '15 at 16:12
  • After you added the `@Component` annotation, Spring actually tried to instantiate your class for the frist time, so that was ok. After that you added a default constructor, that was also ok. The last step should have been to invoke the super constructor from your own default constructor with the parameters you already had: `super(MemberController.class, MemberResource.class);` – Gergely Bacso Nov 28 '15 at 17:02
-1

I added a bean definition in the Application.class which solved the issue

    @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);
    }
}
Arghya Sadhu
  • 41,002
  • 9
  • 78
  • 107