gpt4 book ai didi

java - 将 DAO Autowiring 到域对象中

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:41:14 25 4
gpt4 key购买 nike

我正在为网站编写功能区/成就系统,我必须为系统中的每个功能区编写一些逻辑。例如,如果您是前 2,000 名注册该网站的人或在 1,000 名论坛中发帖的人,您就可以获得丝带。这个想法与 stackoverflow 的徽章非常相似,真的。

因此,每个丝带显然都在数据库中,但他们还需要一些逻辑来确定用户何时赢得了丝带。

按照我的编码方式,Ribbon 是一个简单的抽象类:

@Entity
@Table(name = "ribbon")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "ribbon_type")
public abstract class Ribbon
{
@Id
@Column(name = "id", nullable = false, length = 8)
private int id;

@Column(name = "title", nullable = false, length = 64)
private String title;

public Ribbon()
{
}

public abstract boolean isEarned(User user);

// ... getters/setters...
}

您可以看到我将继承策略定义为 SINGLE_TABLE(因为我必须像 50 条丝带一样编码,而且我不需要为它们添加额外的列)。

现在,一个特定的功能区将像这样实现,例如:

@Entity
public class First2000UsersRibbon extends Ribbon
{
@Autowired
@Transient
private UserHasRibbonDao userHasRibbonDao;

public First2000UsersRibbon()
{
super.setId(1);
super.setTitle("Between the first 2,000 users who registered to the website");
}

@Override
public boolean isEarned(User user)
{
if(!userHasRibbonDao.userHasRibbon(user, this))
{
// TODO
// All the logic to determine whether the user earned the ribbon
// i.e. check whether the user is between the first 2000 users who registered to the website
// Other autowired DAOs are needed
}
else
{
return true;
}

return false;
}
}

问题在于 isEarned() 方法中的 userHasRibbonDao 为 null,因此会抛出 NullPointerException

我认为将 DAO Autowiring 到域对象中是错误的,但在 this topic他们告诉我这是正确的方法(领域驱动设计)。

我在 GitHub 上分享了一个非常简单的非工作示例:https://github.com/MintTwist/TestApp (记得更改/WEB-INF/properties/jdbc.properties 中的连接详细信息并导入 test_app.sql 脚本)

非常感谢任何帮助。

谢谢!

更新 - 阅读第一个答案,我的方法似乎完全错误。假设可能有 50-70 个不同的色带,您将如何理想地构建代码?谢谢

最佳答案

我并不是说我同意将 DAO 注入(inject)域实例....但是

您可以将您的 DAO 连接到您的域对象中。但是您必须在 spring 应用程序上下文中声明您的域对象,并使用 new 从 Spring NOT 获取新实例。确保使用原型(prototype)范围!您不希望每次都获得相同的单例实例!

实际上,您要实现的这个逻辑属于一个服务,该服务注入(inject)了它所需的 DAO。

也许您可以提供如下服务:

@Service
public class RibbonServiceImpl implements RibbonService

@Autowired
private RibbonDAO ribbonDAO;

public boolean isEarned(Ribbon ribbon, User user) {
if(!userHasRibbonDao.userHasRibbon(user, this))
{
// TODO
// All the logic to determine whether the user earned the ribbon
// i.e. check whether the user is between the first 2000 users who registered to the website
// Other autowired DAOs are needed
}
else
{
return true;
}

return false;
}

关于java - 将 DAO Autowiring 到域对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11056693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com