2017-07-15 1 views
1

Ich entwerfe eine API mit Spring Boot für einige soziale Netzwerk-Backend. Mein aktuelles Modell sieht so aus:Design von DTO aus Model für eine API

public class User { 

    private long id; 
    private String handle; 
    private String name; 
    private List<User> followers; 
    private List<User> following; 

    // Getters setters etc 

Jetzt habe ich DTO erstellt, die der obigen Struktur sehr ähnlich ist. Mein Problem ist, dass ich manchmal genau das zurückgeben möchte, was oben ist (was gut ist), aber manchmal will ich das nicht.

Zum Beispiel, wenn jemand daran interessiert sind nur bei der Suche nach Anhängern des Benutzers ist, ich will nicht Nachfolger aufzunehmen und nach (ich bin einfach interessiert id, handle und name so Rechen followers und following für alle diese Benutzer wäre eine unglaubliche Verschwendung von Ressourcen).

In meiner aktuellen Implementierung sind diese Felder mit null Werte zurückgegeben, die ich glaube nicht, ist eine gute Idee. Sollte ich ein separates DTO ohne diese Listen nur mit id, handle und name erstellen? Oder gibt es einen eleganteren Weg?

+1

Ich denke, eleganter ist, wenn Sie eine weitere Ebene in Ihrem api erstellen, in dem Sie eine Anforderung der Benutzer durch id machen kann nur teilweise Werte zu erhalten, keinen Sinn haben, wenn Sie Alle Werte nur abrufen, um einen Wert aus der DTO-Antwort zu erhalten. –

Antwort

3

Es ist ein umstrittenes Thema. Wenn Sie keine separate dto erstellen möchten, gibt es mehrere Möglichkeiten, dies zu tun. Es hängt davon ab, welche Daten Zugriff Ansatz, den Sie verwenden wollen:

Mit Spring Data JPA ist es möglich, eine Einheit in der Projektion zurückzukehren. Sie müssen nur einen zusätzlichen Konstruktor zu Ihrem Unternehmen hinzuzufügen:

public interface UserRepository extends JpaRepository<User, Long> { 
    @Query("select new User(u.id,u.name) from User u") 
    List<User> findAllUserItems(); 
} 

Oder gleiche mit JPA EntityManger:

public List<User> findAllUserItems() { 
     return entityManager.createQuery("select new User(u.id,u.name) from User u", User.class) 
       .getResultList(); 
    } 

Wenn Sie unnötigen Null-Feldern fragen, und Sie sind mit Jackson ist es möglich, konfigurieren um Nullfelder zu ignorieren. Für das Frühjahr Boot:

spring.jackson.default-property-inclusion=non_null 

Oder mit Java config:

@Bean 
    public Jackson2ObjectMapperBuilder objectMapperBuilder() { 
     Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
     builder.serializationInclusion(JsonInclude.Include.NON_NULL); 
     return builder; 
    } 

Oder nicht Frühling Bootprojekt:

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 
    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(converter()); 
    } 

    @Bean 
    public HttpMessageConverter converter() { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
     return new MappingJackson2HttpMessageConverter(objectMapper); 
    } 
} 

Auch, wenn Sie gehen Hibernate Session verwenden. So ordnen Sie direkt zu dto Sie verwenden AliasToBeanResultTransformer:

public List<UserDto> findAllUserItems() { 
      return session.createQuery("select u.id as id,u.name as name from User u") 
        .setResultTransformer(Transformers.aliasToBean(UserDto.class)) 
        .list(); 
} 
0

Angenommen, Sie können so versuchen.

@Entity 
public class User implements Serializable { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    @ManyToOne 
    private User parent; 

    @OneToMany(mappedBy="parent") 
    private List<User> followers; 

    @OneToMany(mappedBy="parent") 
    private List<User> following; 

    // Getters, Setters etc.... 
} 

Auch dieses post kann hilfreich sein.

+1

Wie beantwortet das genau die Frage? Das OP möchte wissen, wie er verhindern kann, dass bestimmte Felder in seiner REST-API mithilfe von DTOs zurückgegeben werden, während Ihre Lösung nur eine Entität ist? – g00glen00b