【发布时间】:2017-07-26 14:47:33
【问题描述】:
我正在开发一个将 JAX-RS 用于 WebLayer 的 Java EE 应用程序。
我试图解决这个问题。因此,您将看到的代码只是一个剪切。目前一切正常。如您所见,我有一个UserEndpoint,客户端可以在其中创建新用户。一切完成后,VerificationService 会发送一封验证邮件。
用户端点
@Path("/users")
@Stateless
public class UserEndpoint {
@Inject
@AuthenticatedUser
private User authenticatedUser;
@EJB
private UserDAO userDAO;
@EJB
private TokenDAO tokenDAO;
@Inject
private PasswordValidator passwordValidator;
@Inject
private UserValidator validator;
@Inject
private VerificationService verificationService;
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public User createUser(User user) {
// Validation and Creation
// Verification
this.verificationService.sendVerificationMail(user);
return user;
}
}
验证服务
@Singleton
public class VerificationService {
@Inject
private MailService mailSender;
@Inject
private TemplateService templateService;
public void sendVerificationMail(User user) {
this.templateService.setUserTemplate(TemplateCategory.VerificationTemplate, user);
mailSender.sendMail(new Message(
MessageDAO.systemEmailAddresses.get(0),
user.getEmail(),
templateService.getSubject(),
templateService.getContent()));
}
}
因为我想要一个可扩展的项目,所以我决定封装端点的一部分,这样我就可以在其他项目中使用它。由于每个用户都必须以一种或另一种方式进行验证,我认为封装验证过程是一个好主意。问题是我不知道如何实现这一点。我的第一种方法如下:
CoreUserEndpoint
@Path("/users")
@Stateless
public abstract class CoreUserEndpoint<D extends BaseUserDAO<T>, T extends BaseUser, V extends CoreUserValidator<D, T>> extends EntityEndpoint<D, T, V> {
@EJB
private TokenDAO tokenDAO;
@Inject
private PasswordValidator passwordValidator;
@Inject
private VerificationService<T> verificationService;
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public User createUser(User user) {
// Validation and Creation
// Verification
this.verificationService.sendVerificationMail(user);
return user;
}
}
实体端点
@Stateless
public class EntityEndpoint<D extends CoreDAO<T>, T extends CoreEntity, V extends CoreValidator> {
protected D entityDAO;
@Inject
@AuthenticatedUser
protected T authenticatedUser;
protected V entityValidator;
}
验证服务
@Singleton
public class VerificationService<T extends BaseUser> {
@Inject
private MailService mailSender;
@Inject
private TemplateService<T> templateService;
public void sendVerificationMail(User user) {
this.templateService.setUserTemplate(TemplateCategory.VerificationTemplate, user);
mailSender.sendMail(new Message(
MessageDAO.systemEmailAddresses.get(0),
user.getEmail(),
templateService.getSubject(),
templateService.getContent()));
}
}
当我尝试这个时,我得到了著名的WELD-001408: Unsatisfied dependencies 错误。我想我确实理解为什么会这样。当我读到here 时,我不能使用泛型,既不能用于@Inject,也不能用于@EJB。但是,如果我不能使用泛型,我该如何封装我的项目的核心?他们是否有任何解决方法或不同的方法?我确信互联网上的任何地方都已经有解决方案。但是经过 3 天的搜索没有取得任何进展,我真的很沮丧,并认为最好问问你们。因此,如果您能指出正确的方向,我将不胜感激。
【问题讨论】:
标签: java generics dependency-injection