簡體   English   中英

JAXB,帶有對象的Moxy取消編組JSON HTTP參數

[英]JAXB, Moxy Unmarshal JSON HTTP Parameters with Object

這類似於我在這里的帖子...

JAXB Unmarshal JSON HTTP POST參數

除了在這種情況下,我需要解組我的JSON,它不僅包含HTTP POST參數而且還包含一個對象。 考慮以下JSON ...

{
  "client": "1",
  "forTopic": "topic",
  "MyObject":{
    "name":"the name",
    "id":1
  }
}

client和forTopic是HTTP POST參數。 MyObject是我要接收以對其執行操作的對象。 我想將參數與對象分開。

我可以通過設置一個包含3個字段的對象來做到這一點。 字段1是客戶端的字符串。 字段2是ID的整數。 字段3是MyObject theObject。

這樣我就可以把一切都拉好。 但是,我希望不必為每個具有參數的對象創建一個“包裝器”類。 有沒有更好/合適的方法來做到這一點? 通過將參數從JSON中拉出並留給MyObject生成的JSON然后進行解組,還是以某種方式指定深度以深入探究要解組的JSON? 這些參數對於我的每個對象都相當一致。 我只是不想為它們全部創建包裝器。

也許這是另一種詢問方式是使用JAXB / Moxy處理JSON中包含的HTTP POST參數的正確方法是什么?

編輯:

以供參考。 這是我相關的依賴項。

    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>org.eclipse.persistence.moxy</artifactId>
        <version>2.7.2</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>

還有我的jaxb.properties ...

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

就我個人而言,我將使用包裝對象,但是有一些方法可以執行您想要的操作。 我創建了一個小型spring boot應用程序來檢查您的情況。

首先讓我們為MyObject創建一個使用jaxb的pojo:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class MyObject {
    @XmlElement(name = "id")
    private String id_blah;

    @XmlElement(name = "name")
    private String Name;

    public String getId_blah() {
        return id_blah;
    }

    public void setId_blah(String id_blah) {
        this.id_blah = id_blah;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }
}

我們將創建一個自定義解串器來處理傳入的有效負載:

public class MyObjectDeserializer extends StdDeserializer<MyObject> {


        public MyObjectDeserializer() {
            this(null);
        }

        public MyObjectDeserializer(Class<?> vc) {
            super(vc);
        }

        @Override
        public MyObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {

            JsonNode jsonPayload = jp.getCodec().readTree(jp);
            JsonNode myObjectNode = jsonPayload.get("MyObject");
            MyObject myObject = new MyObject();
            myObject.setId_blah(myObjectNode.get("id").textValue());
            myObject.setName(myObjectNode.get("name").textValue());
            return myObject;
        }
    }

我們將反序列化器注冊到消息轉換器中:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }


    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters);

        ObjectMapper objectMapper = new ObjectMapper();
        MappingJackson2HttpMessageConverter jaxMsgConverter = new MappingJackson2HttpMessageConverter();
        AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
        objectMapper.setAnnotationIntrospector(introspector);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        SimpleModule module = new SimpleModule();
        module.addDeserializer(MyObject.class, new MyObjectDeserializer());
        objectMapper.registerModule(module);
        jaxMsgConverter.setObjectMapper(objectMapper);
        converters.add(jaxMsgConverter);
    }
}

還有一個端點來測試一切正常:

@RestController
public class Controller {

    @PostMapping("/test")
    public String test(@RequestBody MyObject myObject) {
        return myObject.getName();
    }
}

在您的問題中發布json效果很好。

我的示例項目的依賴項:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.11</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-jaxb-annotations</artifactId>
            <version>2.9.6</version>
        </dependency>
    </dependencies>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM