2016-07-20 6 views
1

Wie der Titel sagt ....Ist es möglich, ein Objekt wie dieses zur Laufzeit in Java zu erstellen?

Ich möchte ein POJO mit vier Feldvariablen erstellen und bei bestimmten Laufzeitereignissen eine Instanz dieses POJO mit Zugriff auf möglicherweise zwei oder drei der Felder erstellen.

public class Category implements Serializable { 

    private String name; 

    private String description; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 
} 

Lets sagen, dass ich ein neues Kategorie-Objekt erstellen, aber ich möchte nur in der Lage sein, den Zugang zu dem Namensfeld während der Laufzeit zu haben. Gibt es ein Entwurfsmuster, mit dem ich das erreichen kann? Ich dachte über das Strategie-Muster nach und schaute den Baumeister an, aber ich bin immer noch verwirrt, wenn ich das in Java machen kann.

Grundsätzlich ist das Gesamtziel, ein Objekt aus einer Datenbank zu greifen und es als JSON-Antwort in Jax RS zurückzugeben. Manchmal möchte ich jedoch kein vollständiges Objekt zurückgeben, sondern nur die Hälfte des Objekts, auf das während bestimmter Laufzeit-Ereignisse zugegriffen werden kann. Ich entschuldige mich, wenn das wie eine dumme Frage scheint, aber ich weiß, was ich tun möchte, aber ich weiß einfach nicht den besten Weg.

+0

Bei den meisten ORM-Tools bringen Sie normalerweise entweder das gesamte Objekt oder gar nichts ein. Also wollen Sie, dass sich die Zugriffsebene Ihrer Setter zur Laufzeit ändert? –

+0

Okay, da du über * JSON * sprichst, suchst du vielleicht nach JSON-Projektionen. Ich weiß, dass sie von Spring und Jackson unterstützt werden, aber ich weiß nicht viel über JAX-RS. – chrylis

+0

Projektionen ist genau das, was ich brauche .... Frage ist, kann ich tun, ohne Feder und nur mit jackson .... – Grim

Antwort

1

Ich habe das gleiche Problem mit Ihnen, und wurde mein Projekt springmvc verwendet, und das json-Tool ist jackson.With das Problem gelöst, ich @JsonIgnore nur .Für weitere Informationen verwenden, lesen Sie einfach jackson-how-to-prevent-field-serialization

+0

Ich muss in der Lage sein zu ändern, wie das Objekt zur Laufzeit serialisiert und deserialisiert wird. Aus meiner Sicht wird @JsonIgnore verhindern, dass dieses Feld serialisierbar wird. – Grim

1

So jemand richtig ich, wenn ich falsch liege oder eine bessere Option als das sehe ... mit einer Menge von Objekten kann dies viel zusätzlichen Code für die Serialisierung und Deserialisierung sein ... Jackson Provisionen ist was ich brauche. Ich kann die Annotation @JsonView (DummyClass.class) für die Feldvariable verwenden. Ich werde dies innerhalb von ein oder zwei Tagen als die beste Antwort akzeptieren, es sei denn, jemand anders schreibt eine bessere Antwort.

// View definitions: 
    class Views { 
      static class Public { } 
      static class ExtendedPublic extends PublicView { } 
      static class Internal extends ExtendedPublicView { } 
    } 

    public class Bean { 
      // Name is public 
      @JsonView(Views.Public.class) String name; 
      // Address semi-public 
      @JsonView(Views.ExtendPublic.class) Address address; 
      // SSN only for internal usage 
      @JsonView(Views.Internal.class) SocialSecNumber ssn; 
    } 

Mit einer solchen Sichtdefinitionen, würde Serialisierung wie so geschehen:

// short-cut: 
    objectMapper.writeValueUsingView(out, beanInstance, ViewsPublic.class); 

    // or fully exploded: 
    objectMapper.getSerializationConfig().setSerializationView(Views.Public.class); 
    // (note: can also pre-construct config object with 'mapper.copySerializationConfig'; reuse) 
    objectMapper.writeValue(out, beanInstance); // will use active view set via Config 

    // or, starting with 1.5, more convenient (ObjectWriter is reusable too) 
    objectMapper.viewWriter(ViewsPublic.class).writeValue(out, beanInstance); 

Diese Information wurde von http://wiki.fasterxml.com/JacksonJsonViews

mit Jackson 2.3, zog ich das tun kann mit JAX-RS

public class Resource { 

     @JsonView(Views.Public.class) 
     @GET 
     @Produces(MediaType.APPLICATION_JSON) 
     public List<Object> getElements() { 
     ... 
     return someResultList; 
     } 
    } 
Verwandte Themen