Как точно соответствовать выводу json из cxf? - PullRequest
3 голосов
/ 04 февраля 2011

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

исходное сообщение:

Привет, В настоящее время мы используем 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?

Спасибо! джо

Ответы [ 3 ]

3 голосов
/ 04 февраля 2011

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

  JSONJAXBContext c = create the context
  JSONMarshaller m = c.createJSONMarshaller();
  YourJAXBObject obj = your object
  StringWriter writer = some writer
  m.marshallToJSON(obj, writer);
2 голосов
/ 05 февраля 2011

Похоже, что вы не только используете CXF, но и не используете сериализацию json Джексона.Зачем?Потому что Джексон не добавляет '@' перед вещами, объявленными как атрибуты.

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

0 голосов
/ 12 марта 2012

Да. Можно установить Джексона в качестве поставщика, как в http://cxf.apache.org/docs/jax-rs-data-bindings.html , Я заметил, что Джексон во многих отношениях прост и удобен.

...