[英]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.