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

时间:2019-03-25 16:41:10

标签: java dependency-injection wildfly cdi

在遵循此tutorial for mvc 1.0时出现此错误。

  

[错误]由以下原因引起:org.jboss.weld.exceptions.DeploymentException:WELD-001408:类型模型的限定项不满意,其限定符位于注入点@Default [BackedAnnotatedField] @Inject ch.xxx.controller.UserController.models ch.xxx.controller.UserController.models(UserController.java:0)

我尝试过...

  • 将我的beans.xml放入多个位置(资源/META-INF/beans.xml | webapp / WEB-INF / beans.xml)
  • 将bean发现模式更改为“全部”
  • 用@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";
    }
}

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

1 个答案:

答案 0 :(得分: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所驻留的工件中是否存在bean.xml?

    src / main / reosurces / META-INF / beans.xml(对于JAR)

    src / main / webapp / WEB-INF / beans.xml(用于WAR)

  2. 正在使用@RequestScoped注释实现的bean吗?

  3. 如果通过EL进行引用,则使用@Named注释该bean吗?

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