Java веб-сервис не может правильно обработать xml. А именно, он не может читать и формировать значения атрибутов. То есть такой xml -текст обрабатывается корректно и данные не теряются:
![введите сюда описание изображения](https://i.stack.imgur.com/hPCTP.png)
Но если использовать атрибуты, то их значения не передается, а переменные в классе pojo остаются пустыми, хотя я использую необходимые аннотации. Xml пример:
![введите сюда описание изображения](https://i.stack.imgur.com/ojU2j.png)
Также проблемы с формированием файла xml. Ожидаемый результат, который я хочу получить от веб-службы:
![введите сюда описание изображения](https://i.stack.imgur.com/dOJDh.png)
Фактический результат:
![введите сюда описание изображения](https://i.stack.imgur.com/dorBA.png)
На передаваемые данные прошу не обращать внимания)
Источник.
Сам веб-сервис:
Тест. java
@RestController
@RequestMapping(path = "/test")
public class Test {
@Autowired
private Dao dao;
@ApiOperation(value = "", response = Response.class)
@RequestMapping(value = "/test-method", method = RequestMethod.POST,
produces = {MediaType.APPLICATION_XML_VALUE},
consumes = {MediaType.APPLICATION_XML_VALUE})
@ResponseBody
public Response method1(@RequestBody Request request) throws Throwable {
Response res = dao.method1(request);
return res;
}
}
Dao. java
public interface Dao {
public Response method1(Request request) throws Throwable;
}
DaoImpl. java
@Service("Test")
@Repository
public class DaoImpl implements Dao {
final static String SERVICE_NAME = "Test";
public Response method1(Request request) throws Throwable {
ServiceMain c = new <Result>ServiceMain(SERVICE_NAME, Response.class);
/*
Inbound and outbound processing
and
Work with a DB
*/
return (Response)c.data;
}
}
Инициализатор. java
public class Initializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { WebAppConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
SwaggerConfig. java
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build().apiInfo(metaData());
}
private ApiInfo metaData() {
return new ApiInfoBuilder().title("Test")
.description("Test example").version("v1.0").build();
}
}
WebAppConfig. java
@Configuration
@EnableWebMvc
@ComponentScan("ru.test")
public class WebAppConfig extends WebMvcConfigurerAdapter {
public WebAppConfig() {
super();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
Pojo-класс.
Запрос. java:
public class Request {
private String n = null;
private String v = null;
private String sync = null;
public void setN(String n) {
this.n = n;
}
public void setV(String v) {
this.v = v;
}
public void setSync(String sync) {
this.sync = sync;
}
@XmlAttribute
public String getN() {
return n;
}
@XmlAttribute
public String getV() {
return v;
}
@XmlElement
public String getSync() {
return sync;
}
}
UpdateItem. java
@XmlAccessorType(XmlAccessType.FIELD)
public class UpdateItem {
private String sync = null;
private String id = null;
private String kbn = null;
private String description = null;
public void setSync(String sync) {
this.sync = sync;
}
public void setId(String id) {
this.id = id;
}
public void setKbn(String kbn) {
this.kbn = kbn;
}
public void setDescription(String description) {
this.description = description;
}
@XmlAttribute
public String getSync() {
return sync;
}
@XmlAttribute
public String getId() {
return id;
}
@XmlAttribute
public String getKbn() {
return kbn;
}
@XmlValue
public String getDescription() {
return description;
}
}
UpdateItems. java
public class UpdateItems {
private ArrayList<UpdateItem> i = null;
public void setI(ArrayList<UpdateItem> i) {
this.i = i;
}
@XmlElement
public ArrayList<UpdateItem> getI() {
return i;
}
}
Ответ. java
@XmlRootElement
public class Response {
private String sync = null;
private UpdateItems item = null;
private String error = null;
public void setSync(String sync) {
this.sync = sync;
}
public void setItem(UpdateItems item) {
this.item = item;
}
public void setError(String error) {
this.error = error;
}
@XmlElement
public String getSync() {
return sync;
}
@XmlElement
public UpdateItems getItem() {
return item;
}
@XmlElement
public String getError() {
return error;
}
}