2017-08-31 3 views
1

Was ist der beste Weg von Code konstant zu bewegen:Spring - Refactoring - move Einheit konstant Konfiguration (application.properties)

@Entity 
public abstract class Post { 

    ... 

    private static final int HOTPOST_LIKE_TRESHOLD = 6; 

    ... 

    public long increaseLikeCounter() { 
     likesCount++; 

     if (likesCount >= HOTPOST_LIKE_TRESHOLD) { 
     this.setStatus(HOT); 
     } 

     return likesCount; 
    } 

    ... 

} 

zur Konfigurationsdatei Frühling verwenden? (d. h. Spring Boot application.properties)

Die Operation ist nun in der Post-Klasse gekapselt, und es ist OK für mich, HOTPOST_LIKE_TRESHOLD von der Klasse wegzubewegen, aber ich möchte die likeCounter-Methode dort beibehalten, wo sie ist.

+0

Die Post sollte nicht entscheiden, ob sie als heiß angesehen wird - es sollte eine andere Entität geben, die diese Regel codiert, und Sie können die shhere als Bean-Eigenschaft dort haben. –

+0

Ok, aber was ist mit anderen Situationen, in denen Post entscheiden sollte, und es muss einen Wert verwenden, den ich in die Konfiguration verschieben möchte, aber den throug method Parameter nicht übergeben möchte? Die Frage bezieht sich eher auf technische Möglichkeiten als auf Geschäftsregeln. Was ist die beste Möglichkeit, konfigurierbare Eigenschaften in Entitäten zu verwenden (nicht im Frühjahr verwaltet), ohne sie durch Methodenparameter zu übergeben. – msiakis

+0

Nun, wenn wir nur eine technische Möglichkeit diskutieren, dann können Sie im Frühjahr jedes beliebige Objekt automatisch ansteuern, geben Sie ihm nur einen eindeutigen Namen. –

Antwort

2

Änderung Post an:

@Entity 
public abstract class Post { 

    ... 

    protected abstract Integer getHotpostLikeTreshold();  
    ... 

    public long increaseLikeCounter() { 
     likesCount++; 

     if (likesCount >= getHotpostLikeTreshold()) { 
     this.setStatus(HOT); 
     } 

     return likesCount; 
    } 
    ... 

} 

dann die Klasse erweitern, zum Beispiel:

public class SimplePost extends Post { 

@Value("${simplePost.hotpostLikeTreshold}") 
private Integer hotpostLikeTreshold; 

@Override 
protected Integer getHotpostLikeTreshold(){ 
    return hotpostLikeTreshold; 
} 
... 

in Ihrem application.properties hinzufügen

simplePost.hotpostLikeTreshold = 6 

EDIT:

use a Service and getters setters: 

@Service 
public class SimplePostService{ 

    // wire your property in 
    @Value("${simplePost.hotpostLikeTreshold}") 
    private Integer hotpostLikeTreshold; 

    public Post savePost(...){ 
     Post post = new SimplePost(); // you create your post with 'new' 
     ... 
     // set your property 
     post.setHotpostLikeTreshold(this.hotpostLikeTreshold); 
     ... 
     // save your entity 
     SimplePostDAO.save(post); 
    } 

} 
+0

Wir diskutieren JPA @Entity Objekte hier . Sie sind keine Frühlingsbohnen. Wir erstellen sie mit dem "new" -Operator (new SimplePost()) oder über den EntityManager. Wie könnte deine Lösung funktionieren? – msiakis

+0

@msiakis, in diesem Fall müssen Sie diese Konfiguration an einen Ort externalisieren, an dem sie von Spring auto- wired werden kann. –

Verwandte Themen