我有类(例如,在实际项目中,我有JAXB生成的类而不是User):
public class User {
private List<String> users;
public List<String> getUsers() {
return users;
}
}
当我获得User用户(带有数据)时,可以使用JacksonJson将其序列化为String或byte []。但是,当我尝试将其反序列化为User
时,会出现错误:
Cannot construct instance of `javax.xml.bind.JAXBElement` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
因为用户尚未设置。我如何反序列化?
答案 0 :(得分:0)
您可以通过实现自定义反序列化器类来实现。
尝试一下:
String json = null;//your request json
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(User.class,new UserDeserialzer());
User user = objectMapper.registerModule(module).readValue(json,User.class);
反序列化器类:
public class UserDeserialzer extends JsonDeserializer<User>{
@Override
public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode value = new ObjectMapper().readTree(p.getText());
User user = new User();
try {
Field field = user.getClass().getDeclaredField("users");
field.setAccessible(true);
field.set(user,value.get("users"));
}catch (Exception ex){
}
return user;
}
}
对于Spring-boot应用程序:
添加此bean以全局反序列化。
@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(User.class,new UserDeserialzer());
objectMapper.registerModule(module);
builder.configure(objectMapper);
return builder;
}
答案 1 :(得分:0)
如果在创建JAXB对象时更喜欢使用Apache CXF,则可以使用xjc插件在生成对象期间自动创建setter-getter方法。这样对您来说可能非常实用。
我遇到了相同的问题,因此我无需更改代码就解决了问题。
您可以将以下部分添加到pom文件中:
<build>
<plugins>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${version.apache.cxf}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${basedir}/src/main/java</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${basedir}/src/main/resources/wsdl/sample.wsdl</wsdl>
<wsdlLocation>classpath:wsdl/sample.wsdl</wsdlLocation>
<extraargs>
<extraarg>-xjc-Xbg</extraarg>
<extraarg>-xjc-Xcollection-setter-injector</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.cxf.xjcplugins</groupId>
<artifactId>cxf-xjc-boolean</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.andromda.thirdparty.jaxb2_commons</groupId>
<artifactId>collection-setter-injector</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>