Webサイトのリボン/実績システムをコーディングしていますが、システム内のリボンごとにロジックを作成する必要があります。たとえば、最初の2,000人がWebサイトに登録している場合、または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;
}
}
問題は、メソッドuserHasRibbonDao
内でnullであるため、aがスローされることです。isEarned()
NullPointerException
DAOをドメインオブジェクトに自動配線するのは間違っていると思いましたが、このトピックでは、DAOが正しいアプローチ(ドメイン駆動設計)であると教えてくれました。
GitHubで機能しない非常に単純な例を共有しました:https ://github.com/MintTwist/TestApp (/WEB-INF/properties/jdbc.propertiesの接続の詳細を変更し、test_app.sqlスクリプトをインポートすることを忘れないでください)
どんな助けでも大歓迎です。
ありがとうございました!
更新-最初の答えを読んで、私のアプローチは完全に間違っているようです。50〜70の異なるリボンが存在する可能性がある場合、理想的にはコードをどのように構成しますか?ありがとう