当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring WS和JAXB拉取子对象

杨高翰
2023-03-14

我试图从一个我无法控制的SOAP服务中提取数据。层次结构包含ProductOrder-

他们的API使用类似于模拟SQL的查询语言。当我试图提取包括项目在内的数据时,会得到如下的堆栈跟踪。如果排除item,我可以将ProductOrders与ShipTo对象一起拉入,但items始终是一个空列表。

JAVAlang.IllegalStateException:无法在组织上执行CommandLineRunner。springframework。靴子Spring应用程序。callRunner(SpringApplication.java:779)~[spring-boot-1.5.0.RELEASE.jar:1.5.0.RELEASE]位于org。springframework。靴子Spring应用程序。callRunners(SpringApplication.java:760)~[spring-boot-1.5.0.RELEASE.jar:1.5.0.RELEASE]位于org。springframework。靴子Spring应用程序。afterRefresh(SpringApplication.java:747)~[spring-boot-1.5.0.RELEASE.jar:1.5.0.RELEASE]位于org。springframework。靴子Spring应用程序。在edu上运行(SpringApplication.java:315)~[spring-boot-1.5.0.RELEASE.jar:1.5.0.RELEASE]。乌米奇。乌德。送礼师。convioexport。应用main(Application.java:39)~[classes/:na]由:org引起。springframework。oxm。UncategorizedMappingException:未知JAXB异常;嵌套的异常是javax。xml。绑定JAXBEException:ShipTo的字段订单。项目ItemId与组织上记录类型ProductOrder的架构定义不匹配。springframework。oxm。jaxb。贾克斯·马歇尔。convertJaxbException(Jaxb2Marshaller.java:915)~[spring-oxm-4.3.6.RELEASE.jar:4.3.6.RELEASE]位于edu。乌米奇。乌德。送礼师。convioexport。马歇尔先生。unmarshal(CustJaxbUnMarshaller.java:37)~[classes/:na]位于org。springframework。ws。支持马歇尔·林格斯。org上的unmarshal(marshallingtils.java:62)~[spring-ws-core-2.4.0.RELEASE.jar:2.4.0.RELEASE]。springframework。ws。客户果心WebServiceTemplate 3美元。extractData(WebServiceTemplate.java:413)~[spring-ws-core-2.4.0.RELEASE.jar:2.4.0.RELEASE]位于org。springframework。ws。客户果心WebServiceTemplate。doSendAndReceive(WebServiceTemplate.java:619)~[spring-ws-core-2.4.0.RELEASE.jar:2.4.0.RELEASE]。springframework。ws。客户果心WebServiceTemplate。sendAndReceive(WebServiceTemplate.java:555)~[spring-ws-core-2.4.0.RELEASE.jar:2.4.0.RELEASE]。springframework。ws。客户果心WebServiceTemplate。MarshallSendAndReceive(WebServiceTemplate.java:390)~[spring-ws-core-2.4.0.RELEASE.jar:2.4.0.RELEASE]位于org。springframework。ws。客户果心WebServiceTemplate。MarshallSendAndReceive(WebServiceTemplate.java:383)~[spring-ws-core-2.4.0.RELEASE.jar:2.4.0.RELEASE]位于edu。乌米奇。乌德。送礼师。convioexport。服务。ConvioClient。教育大学的queryInternal(ConvioClient.java:159)~[classes/:na]。乌米奇。乌德。送礼师。convioexport。服务。ConvioClient。在edu上查询(ConvioClient.java:134)~[classes/:na]。乌米奇。乌德。送礼师。convioexport。服务。ProductOrderService。getProductOrders(ProductOrderService.java:87)~[classes/:na]位于edu。乌米奇。乌德。送礼师。convioexport。服务。舒适服务。在edu加载(ConvioService.java:82)~[classes/:na]。乌米奇。乌德。送礼师。convioexport。应用lambda$runner$0(Application.java:72)~[classes/:na]位于org。springframework。靴子Spring应用程序。callRunner(SpringApplication.java:776)~[spring-boot-1.5.0.RELEASE.jar:1.5.0.RELEASE]。。。4由于javax而忽略的常见帧。xml。绑定JAXBEException:ShipTo的字段订单。项目ItemId与记录类型ProductOrder的架构定义不匹配。。。省略17个公共框架

产品订单服务包含这样的方法:

public List<ProductOrderObj> getProductOrders(final Date startDate, final Date endDate) {
final String query = String.format("SELECT siteId,orderId,transactionId,purchaseAmount,taxDeductibleValue,\n" +
                "shippingCharge,additionalDonation,discountAmount,discountCode,\n" +
                "creationDate,createdBy,modifyDate,lastChangeBy,storeId,payment,\n" +
                "purchaser,interactionSource,shipTo,\n" +
                "receiptNumber,shipTo.item FROM ProductOrder where creationDate > %s and creationDate < %s",
        convertDate(startDate), convertDate(endDate));

log.info("query is " + query);

final Session session = convioClient.startSession();
final ArrayList<ProductOrderObj> events = new ArrayList<>();
for (int page = 1; page < 100; page++) {
    final List<? extends RecordObj> items = convioClient.query(session, page, ConvioConfiguration.MAX_DOWNLOADS_PER_REQUEST, query);
    if (items.size() < ConvioConfiguration.MAX_DOWNLOADS_PER_REQUEST) {
        events.addAll((List<ProductOrderObj>) items);
        break;
    }
    events.addAll((List<ProductOrderObj>) items);
}
return events;

}

这又称为convioService。有效地做到这一点的查询方法

  private List<? extends RecordObj> queryInternal(final Session session, final 
               int page, final int pageSize, final String q) {
    // setup query
    final Query query = new Query();
    query.setPage(BigInteger.valueOf(page));
    query.setPageSize(BigInteger.valueOf(pageSize));
    query.setQueryString(q);
    log.trace(q);

    // perform query
    try {
        final Object obj = getWebServiceTemplate().marshalSendAndReceive(query,
                new SoapActionExecutionIdCallback(session));
        final QueryResponse response = (QueryResponse) obj;

        if (response != null) {
            log.debug("Response was a " + response.getClass().getName());
            return response.getRecord();
        }
    } catch (final Exception e) {
        log.error(e.getMessage());
        throw e;
    }

    throw new NullPointerException("response was null");
}

共有1个答案

冀永寿
2023-03-14

似乎有两个问题导致这不起作用:

  1. 对象的字段定义不正确。希普托。物品与托运人。项目
  2. 禁用封送器/解封器中dtd的验证
 类似资料:
  • 问题内容: 我试图编组多个对象,例如添加到via中。我开始使用此设置: 和 但是,我得到了以下运行时例外: javax.xml.bind.JAXBException:com.jaxb.example.marshall.Book或其任何超类对此上下文都是未知的] 我的类型定义如下。 书:- 图书清单:- 马歇尔代码:- 我正在尝试放置注释(参考:-JAXB异常:该上下文未知的类)。该注释在我的版本中

  • 问题内容: 我有一个问题。我想使用JAXB将一个对象转换为另一个对象。就像在中,我有一个class 和另一个class ,它们都有相同的参数,实际上都是相同的(复制粘贴),但是包不同。我想使用进行它们之间的转换。 怎么做,请帮帮我。 问题答案: 您可以执行以下操作。 注意: 不需要利用JAXBSource将数据具体化为XML。 它在对象模型上不需要任何注释。 com.home.Student co

  • 这是我的xml: 我为这个xml使用了JAXB和unMarshall,我可以得到描述和外部密钥。但是我不能得到有价值的属性名称。 > 这是我的java类: 组织JAVA 银行JAVA 如何获取属性名称和值?谢谢你

  • 问题内容: 我正在研究的项目使用JAXB参考实现,即类来自软件包。 我有一堂课: 我想使用JAXB编组器来获取对象的JSON表示形式: 封送处理的数据为XML格式,而不是JSON格式。如何指示 JAXB参考实现 输出JSON? 问题答案: JAXB参考实现不支持JSON,您需要添加一个包,例如Jackson或Moxy 莫西 杰克逊 在这里查看示例

  • 我正在为我的REST Web服务使用Spring@RESTController。我尝试在rest方法中返回ResponseEntity对象的对象,而不是返回ModelAndView的对象。对于Strgin类型的响应,当我用一个Jaxbobject构建ResponseEntity时,它会给出HTTP错误406 下面不起作用

  • 问题内容: 我想在REST应用程序中接受和响应JSON对象。我需要发送和接收的数据在.properties文件中。我已经阅读了它们,现在位于Object(From )中。是否可以在不实现新类的情况下编组和解组对象? 我在Weblogic服务器中使用Jax-rs API。 问题答案: 对WebLogic不太熟悉,因此我不知道它使用的是哪个版本的Jersey(1.x或2.x),但是使用1.x,您可以简