如何修复注入模型(javax.mvc.Models)的不满意依赖项?

问题描述 投票:0回答:1

跟随这个tutorial for mvc 1.0时出现此错误。

[错误]引起:org.jboss.weld.exceptions.DeploymentException:WELD-001408:类型模型的不满意依赖关系在注入点使用限定符@Default [BackedAnnotatedField] @Inject ch.xxx.controller.UserController.models at ch.xxx .controller.UserController.models(UserController.java:0)

我试过了...

  • 把我的beans.xml放到多个地方(resources / META-INF / beans.xml | webapp / WEB-INF / beans.xml)
  • 将bean-discovery-mode更改为“all”
  • 用@Named和/或@SessionScoped注释我的User.class(不在教程中)

这是我的User.class

@Entity
@Table(name = "users")
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String email;
    private String password;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

这是我的UserForm.class

import javax.ws.rs.FormParam;

public class UserForm {

    @FormParam("id")
    private String id;

    @FormParam("email")
    private String email;

    @FormParam("password")
    private String password;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

最后我的UserController.class,实际发生错误:

@Controller
@Stateless
@Path("/user")
public class UserController {

    @PersistenceContext
    EntityManager entityManager;

    @Inject
    Models models;

    @GET
    @View("user/all-users.html")
    public void getAllREST(){
        List<User> allUsers = entityManager.createNamedQuery("User.findAll", User.class).getResultList();
        models.put("users", allUsers);
    }

    @GET
    @Path("/create")
    public String getCreateRESTForm(){
        return "user/create-user.html";
    }

    @POST
    @Path("/create")
    public String create(@BeanParam UserForm userForm){
        User user = new User();
        user.setEmail(userForm.getEmail());
        user.setPassword(user.getPassword());

        entityManager.persist(user);

        return "redirect:/user";
    }
}

我真的迷失在这里,因为我不知道还有什么要改变的,以及这个简单形式的实际问题是什么。并且不介意纯文本密码,它仅用于测试。

java dependency-injection wildfly cdi
1个回答
0
投票

我还没有使用JEE MVC,但这似乎是CDI相关的问题,不应该位于MVC框架中,因为它应该只使用CDI。

正如已经回答的那样,这个异常的原因是因为CDI容器找不到该接口的任何可注入的实现,因此无法注入它。

看一下javadoc,它说这个接口的任何实现都需要注入并请求作用域。您确定您期望的实现bean满足这些要求吗?

https://github.com/javaee/mvc-spec/blob/master/api/src/main/java/javax/mvc/Models.java

  1. bean所在的工件中是否存在beans.xml? src / main / resources / META-INF / beans.xml(用于JAR) src / main / webapp / WEB-INF / beans.xml(用于WAR)
  2. 实现bean是否使用@RequestScoped注释?
  3. 如果通过EL引用,bean是否用@Named注释?

另一件事是,不要使JPA实体CDI-Beans并使它们可以注入,这是一种不好的方法,而Models接口及其实现不应该要求它。

© www.soinside.com 2019 - 2024. All rights reserved.