2016-07-20 4 views
1

Как говорится в названии ....Возможно ли построить такой объект во время выполнения в java?

Я хочу построить POJO с четырьмя переменными поля и при определенных событиях времени выполнения создать экземпляр этого POJO с доступом, возможно, к двум или трем полям.

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; 
    } 
} 

Допустим, я создаю новый объект категории, но я только хочу, чтобы иметь возможность иметь доступ к полю имени во время выполнения. Есть ли шаблон дизайна, который я могу использовать для достижения этого? Я думал о шаблоне стратегии и смотрел на строителя, но я все еще смущен, если я могу сделать это в java.

Основная цель - захватить объект из базы данных и вернуть его как ответ JSON в jax rs. Но иногда я не хочу, чтобы возвращался полный объект, но разрешаем только половину объекта, доступного во время определенных событий времени выполнения. Мои извинения, если это кажется глупым вопросом, но я знаю, что хочу, но просто не знаю, как лучше.

+0

С большинством инструментов ORM обычно вы вводите либо весь объект, либо ничего вообще. Значит, вы хотите, чтобы уровень доступа ваших сеттеров менялся во время выполнения? –

+0

Хорошо, поскольку вы говорите о * JSON *, вы можете искать прогнозы JSON. Я знаю, что они поддерживаются Spring и Jackson, но я не знаю много о JAX-RS. – chrylis

+0

Прогнозы - это именно то, что мне нужно .... вопрос в том, могу ли я сделать это без использования весны и с помощью только jackson .... – Grim

ответ

1

У меня такая же проблема с вами, и мой проект был использован SpringMVC и инструмент JSON является jackson.With проблема решена, я просто использую @JsonIgnore .Для более подробной информации, просто читать jackson-how-to-prevent-field-serialization

+0

Мне нужно изменить, как объект сериализуется и десериализован во время выполнения. Из моего понимания @JsonIgnore всегда будет предотвращать сериализацию этого поля. – Grim

1

Так кто-то правильно если я ошибаюсь или вижу лучший вариант, чем этот ... с большим количеством объектов, это может быть много дополнительного кода для сериализации и десериализации ... Требования Jackson - это то, что мне нужно. Я могу использовать аннотацию @JsonView (DummyClass.class) для переменной поля. Я приму это наилучший ответ за день или два, если кто-то другой не ответит лучше.

// 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; 
    } 

С такими определениями зрения, сериализация будет сделано так:

// 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); 

Эта информация была разобрана из http://wiki.fasterxml.com/JacksonJsonViews

с Джексоном 2.3, я могу сделать это с помощью JAX-RS

public class Resource { 

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