【问题标题】:No implementation for models.UserDAO was bound. while locating models.UserDAO没有models.UserDAO的实现被绑定。在定位模型时。UserDAO
【发布时间】:2016-06-08 10:34:21
【问题描述】:

我正在使用 play 创建示例应用程序。

我在运行时遇到这些异常:

1) No implementation for models.UserDAO was bound.
      while locating models.UserDAO
        for parameter 0 at services.impl.UserServiceImpl.<init>(UserServiceImpl.java:24)
      while locating services.UserService
        for parameter 0 at controllers.UserController.<init>(UserController.java:26)
      while locating controllers.UserController
        for parameter 4 at router.Routes.<init>(Routes.scala:44)
      while locating router.Routes
      while locating play.api.inject.RoutesProvider
      while locating play.api.routing.Router
        for parameter 0 at play.api.http.JavaCompatibleHttpRequestHandler.<init>(HttpRequestHandler.scala:200)
      while locating play.api.http.JavaCompatibleHttpRequestHandler
      while locating play.api.http.HttpRequestHandler
        for parameter 4 at play.api.DefaultApplication.<init>(Application.scala:221)
      at play.api.DefaultApplication.class(Application.scala:221)
      while locating play.api.DefaultApplication
      while locating play.api.Application

谁能帮我解决这个问题。

我的课在下面,

UserDAO.java

@Named
@Singleton
public interface UserDAO extends CrudRepository<User, Long> {

    @Query("select userId,firstName from User where userId =:userId")
    public List<Object[]> getUserDetails(@Param("userId") Integer userId);
}

UserController.java

@Named
@Singleton
public class UserController extends Controller {

    private final UserService userService;

    @Inject
    public UserController(final UserService userService) {
        this.userService = userService;
    }

    public Result getUserDetails(Integer userId) {

        JsonNode output = Json.toJson(userService.getUserDetails(userId));
        return ok(output);
    }
}

UserServiceImpl.java

@Named
@Singleton
public class UserServiceImpl implements UserService {

    private final UserDAO userDAO;

    @Inject
    public UserServiceImpl(final UserDAO userDAO)
    {
        this.userDAO=userDAO;
    }

    public MainDTO getUserDetails(Integer userId)
    {
        List<Object[]> query=userDAO.getUserDetails(userId);
        List<UserDTO> list= new LinkedList<UserDTO>();
        UserDTO userDTO=new UserDTO();
        MainDTO mainDTO=new MainDTO();

        for(Object[] rows : query)
        {
            Integer Id = (Integer)rows[0];
            String name = (String)rows[1];

            userDTO.setNumber(Id);
            userDTO.setName(name);
            list.add(userDTO);
        }

        mainDTO.setData(list);

        return mainDTO;

    }
}

请帮我找出上述问题的确切原因。

提前致谢。

【问题讨论】:

  • 您的“UserDAO”实施在哪里?您需要将其与“ImplementedBy”或 guice 模块绑定。
  • 感谢您的回复。现在我使用了 @ImplementedBy(UserServiceImpl.class) 之类的注释,但现在又遇到了另一个问题 services.impl.UserServiceImpl 没有扩展 models.UserDAO。在为 services.impl.UserServiceImpl.(UserServiceImpl.java:24) 中的参数 0 定位 models.UserDAO 同时定位 services.UserService 作为 UserServiceImple 不扩展 DAO
  • 你的@Singleton@Inject注解的包是什么?它应该是 javax.inject.Singleton 和 javax.inject.Inject。但是还有来自 Guice 的其他类似产品,因为你想使用 Spring,它们就行不通了。
  • 是的@Kris。我只使用 avax.inject.Singleton。但我没有找到解决办法。
  • 嗯,我觉得一切都很好。虽然到目前为止我还没有一起使用过 Spring 和 Play。您是否尝试过使用 @Autowired 的原始 Spring 注解?

标签: java spring-mvc playframework


【解决方案1】:

你应该自动装配或注入它。

@Autowired
private final UserDAO userDAO;

servlet-dispatcher.xml

 <bean id="UserDAO " class="com.dao.UserDAOImpl"></bean>

你也可以在构造函数中使用@Qualifier

@Autowired(required=false)
public UserController(@Qualifier("UserServiceImpl") final UserService userService) {
    this.userService = userService;
}

【讨论】:

  • 而且我没有使用像 servlet-dispatcher.xml 这样的 xml。仅使用注释。
  • 然后在@autowired中提供ByName=com.pkg.UserDAOImpl
  • 非常感谢@Parth Trivedi 的回答。我尝试了以上所有方法。但我得到了与上面相同的异常。我找不到问题在哪里。
  • 您使用的是什么版本的 info.cukes.cucumber-java?你是用 cucumber.properties 还是 cucumber-guice.properties 来定义注入源?
猜你喜欢
  • 2012-03-25
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多