2011-02-04 8 views
3

Редактировать: Я был в замешательстве - использовал cxf, а не трикотаж. Есть ли способ конвертировать аннотированный объект в json, который похож на ObjectMapper от Jackson?Как точно соответствовать json-выходу из cxf?

оригинальный тзд:

Привет, настоящее время мы используем jaxrs для преобразования наших веб ответов на XML/JSON. Однако теперь я хотел бы создать эквивалентную строку json внутри моего кода с помощью ObjectMapper (?).

Например, данный контроллер и JAXB аннотированных возврата объекта:

@Path("/foo") 
@Produces({"application/json", "application/xml"}) 
public class FooController { 

    @GET 
    @Path("/some_action") 
    public TopDTO someAction(@QueryParam("arg") String arg) { 
     ... 
    } 
} 

@XmlRootElement(name="topDTO") 
@XmlAccessorType(XmlAccessType.NONE) 
public class TopDTO { 
    ... 
    @XmlAttribute(name="attr") 
    public String getAttr() { 
     return "blah"; 
    } 
    @XmlElement(name="innerDTO") 
    public InnerDTO getInnerDTO() { 
     ... 
    } 
} 

@XmlRootElement(name="innerDTO") 
@XmlAccessorType(XmlAccessType.NONE) 
public class InnerDTO { 
    ... 
} 

задерживаясь http://myserver/.../foo.json тушит некоторые довольно JSON:

{"topDTO":{"@attr":"blah","innerDTO":...}} 

Теперь я хотел бы иметь возможность создавать что точное json внутренне:

ObjectMapper mapper = new ObjectMapper(); 
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(); 
mapper.getSerializationConfig().setAnnotationIntrospector(introspector); 
mapper.getSerializationConfig().setSerializationInclusion(Inclusion.ALWAYS);    
mapper.getSerializationConfig().set(SerializationConfig.Feature.AUTO_DETECT_FIELDS, false); 
mapper.getSerializationConfig().set(SerializationConfig.Feature.WRAP_ROOT_VALUE, true); 
return mapper.writeValueAsString(snapshotDTO); 

Однако, похоже, что это не работает вообще; большая часть аннотированных атрибутов и элементов отсутствует, атрибуты не имеют префикса с «@», так как они с выходом jaxrs и т. д.

Я пропустил что-то простое? Как сам jaxrs преобразует аннотированный объект в строку json?

Спасибо! joe

+0

Я сомневаюсь, что вы это заработаете. Джерси и Джексон работают совсем по-другому и производят разные стили JSON. Вам будет лучше использовать Джерси, чтобы программно создать ваш JSON. – skaffman

+0

К сожалению, я был немного смущен. Оказывается, использовали cxf, а не трикотаж. :( –

+0

Вы когда-нибудь находили решение этой проблемы? –

ответ

3

Используйте JSONJAXBContext по номеру create a marshaller и используйте его для сериализации вашего объекта в формате JSON. Я не думаю, что тебе нужен Джексон.

JSONJAXBContext c = create the context 
    JSONMarshaller m = c.createJSONMarshaller(); 
    YourJAXBObject obj = your object 
    StringWriter writer = some writer 
    m.marshallToJSON(obj, writer); 
2

На самом деле это выглядит не только с использованием CXF, вы не используете сериализацию Json Jackson. Зачем? Поскольку Джексон не добавляет «@» перед вещами, объявленными как атрибуты.

Если вы хотите использовать ObjectMapper, вы, вероятно, захотите начать с настроек по умолчанию, и попытайтесь изменить вещи в соответствии с тем, что вы хотите изменить, а не с помощью набора переопределений конфигурации (например: вы отключите getter/автоматическое определение сеттера, которое не похоже на то, что вы должны делать).

+2

- это правильно. Сериализатор JSON по умолчанию CXF - это Jettison, который добавляет символы «@». Джексон не делает. Однако вы можете сделать Jackson по умолчанию с помощью Spring xml config: http : //cxf.547215.n5.nabble.com/Overriding-the-default-Jettison-JSON-Provider-td1223554.html –

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

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