2016-08-17 5 views
0

Я работаю над проектом в struts2 с помощью json-plugin: у меня есть BaseAction, который расширяет ActionSupport и объявляет некоторые общие поля, помеченные аннотацией @JsonProperty ,Как получить значения, хранящиеся в полях класса, помеченных знаком @JsonProperty

public abstract class BaseAction extends ActionSupport { 
    @JsonProperty 
    private String commonField1; 
    @JsonProperty 
    private String commonField2; 

    public String execute() { 
     executeAction(); 
     //some things to get the values in the JsonProperties 
    } 

    public abstract void executeAction(); 
} 

Каждое действие в этой структуре расширяет BaseAction и объявляет некоторые конкретные поля, помеченные как @JsonProperty.

public class SpecificAction extends BaseAction { 
    @JsonProperty 
    private String specificField1; 
    @JsonProperty 
    private String specificField2; 

    public void executeAction() { 
     //things 
    } 
} 

Я искал способ доступа, в BaseAction, чтобы все значения, которые хранятся во всех областях @JsonProperty.

EDIT

Я попробовал вчера, используя

ObjectMapper mapper = new ObjectMapper(); 
mapper.writeValueAsString(this); 

Но это не сработало. Правильно ли это?

Я также попытался использовать отражение как ответ сказал, как это:

Field[] fields = this.getClass().getDeclaredFields(); 
      Map<String, Object> jsonProperties = new HashMap<String, Object>(); 
      for (Field field : fields) { 
       logger.debug(methodName, "Field " + field.getName()); 
       field.setAccessible(true); 
       try { 
        if(field.isAnnotationPresent(JsonProperty.class)) { 
         Object obj = new Object(); 
         logger.debug(methodName, "Field: " + field.getName()); 
         jsonProperties.put(field.getName(), field.get(obj)); 
        } 
       } catch(Exception e) { 
        logger.error(methodName, "Errore", e); 
       } 

      } 

Но он вернулся мне исключение, что я не в состоянии решить:

IllegalArgumentException: Не удается установить сеть .sf.json.JSONObject в java.lang.Object

+0

Jackson может иметь доступ к этим свойствам. –

ответ

0

Единственный способ доступа к свойствам суперкласса - это отражение.

В методе BaseAction.execute() вы можете узнать фактический класс объекта, а затем перебрать все атрибуты, проверяя, имеет ли атрибут аннотацию @JsonProperty. Если аннотация найдена, вы можете получить имя и значение атрибута.

Я бы порекомендовал вам изменить дизайн вашей системы, поэтому вам не нужно это делать.

 Смежные вопросы

  • Нет связанных вопросов^_^