2016-11-30 2 views
0

Есть ли способ, которым мы можем добавить ObjectMapper для определенного класса с помощью аннотации.Отображение сопоставления объектов для определенного класса во время HTTP-звонков

@JsonRootName("employee") 
public class Sample implements Serializable{ 
    private String name; 
    private String id; 
    // Getters and setters 
} 

В RestController я есть RequestMapping и способ, как: -

@ResponseBody 
public Sample (@RequestBody Sample sample){ 
//some logic 
return sample; 
} 

Мой вход полезной нагрузки это будет как

{ 
     "employee":{ 
      "name":"abcd", 
      "id":"1234" 
     } 
    } 

Мой желаемый результат будет

{ 
    "name":"abcd", 
    "id":"1234" 
} 

1) Есть ли способ i может использовать один и тот же класс для выполнения ввода и вывода.

2) Я добавил @JsonRootName в верхней части класса, который требует функции сериализации ObjectMapper позволяют в WRAP_ROOT_VALUE как: -

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE); 
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 

, где это может быть добавлено, чтобы отразить только в этом классе.

ответ

2

Возможно, просто оставите поведение сериализации по умолчанию? Затем при десериализации вы все равно вытащите оболочку «employee», но при сериализации вы будете писать ее без оболочки.

ObjectMapper mapper = new ObjectMapper(); 
//mapper.enable(SerializationFeature.WRAP_ROOT_VALUE); 
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 

С вашим входом, я получил желаемый результат сериализации:

{"name":"abcd","id":"1234"} 

EDIT

Что касается где поставить этот код, я бы рекомендовал одноплодный или класс со статическим методы, которые обрабатывают серию (de). У вас может быть два разных устройства, чем выполнение «нормального» или «завернутого» поведения. Вот набросок статического метода подхода:

public class SerializationUtil { 
    private static ObjectMapper normalObjectMapper; 
    private static ObjectMapper wrappedObjectMapper; 

    static { 
     /* configure different (de)serialization strategies */ 
     normalObjectMapper = new ObjectMapper(); 
     wrappedObjectMapper = new ObjectMapper(); 
     wrappedObjectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE); 
     wrappedObjectMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 
    } 

    public static <T> T normalDeserialize(String json, Class<T> clazz) throws Exception { 
     return normalObjectMapper.readValue(json, clazz); 
    } 

    public static String normalSerialize(Object bean) throws Exception { 
     return normalObjectMapper.writeValueAsString(bean); 
    } 

    public static <T> T deserializeWrappedObject(String json, Class<T> clazz) throws Exception { 
     return wrappedObjectMapper.readValue(json, clazz); 
    } 

    public static String serializeWrappedObject(Object bean) throws Exception { 
     return wrappedObjectMapper.writeValueAsString(bean); 
    } 
} 

Преимуществом этого метода является то, что позволяет абоненту решить поведение сериализации. Поэтому, если есть части вашего кода, где вам нужно обрабатывать его по-разному, вы можете вызвать другой метод. Обратите внимание, что обертывание/распаковка включены. Таким образом, чтобы получить желаемое поведение, вы могли бы назвать эти методы, как так:

public static void main(String[] args) { 
    Bean bean = SerializationUtil.deserializeWrappedObject(jsonInput, Bean.class); 
    String jsonOutput = SerializationUtil.normalSerialize(bean); 
} 

Если это не обращаюсь к вам, вы можете альтернативно обнаружить особый случай и обрабатывать его в том же вызове метода:

public static <T> T deserialize(String json, Class<T> clazz) throws Exception { 
    if (clazz instanceof Bean) { 
     return wrappedObjectMapper.readValue(json, clazz); 
    } else { 
     return normalObjectMapper.readValue(json, clazz); 
    } 
} 
+0

В моем вопросе также спрашивается, куда поставить этот код картографа объекта, потому что, если я создам компонент, он применим ко всему проекту. Но я хочу только deserilisation в этом классе Sample, а не в любом другом классе. – sunder

+0

@sunder Я обновил свой ответ. Это то, что вы ищете? – gregbert

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