Как добраться, сырые данные xml возвратился из запроса к веб-сервису?

Думал, что существует универсальное стирание Java, но мы знаем, что такое универсальный, поэтому мы можем решить его таким образом с Джексоном.

    @Test
    void 测试() {
        Map<Integer,Long> map = new HashMap<>();
        map.put(1,0L);

        String json = null;
        try {
            json = mapper.writeValueAsString(map);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        MapType mapType = mapper.getTypeFactory().constructMapType(map.getClass(), Integer.class, Long.class);
        Map<Integer,Long> mapFromJson = null;
        try {
            mapFromJson = mapper.readValue(json,mapType);
        } catch (IOException e) {
            e.printStackTrace();
        }

        for(Long v : mapFromJson.values()) {
            // will not throw ClassCastException
            System.out.println(v);
        }
    }

Может быть, лучше, так как вы можете просто скопировать тип:

    @Test
    void 测试() {
        Map<Integer,Long> map = new HashMap<>();
        map.put(1,0L);

        // I know this way violates the java generic constraint.
        String json = null;
        try {
            json = mapper.writeValueAsString(map);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        Map<Integer,Long> mapFromJson = null;
        try {
            mapFromJson = mapper.readValue(json, new TypeReference<Map<Integer,Long>>(){});
        } catch (IOException e) {
            e.printStackTrace();
        }

        for(Long v : mapFromJson.values()) {
            // will throw ClassCastException
            System.out.println(v);
        }
    }
5
задан VanOrman 24 November 2008 в 16:34
поделиться

2 ответа

У Вас есть две реальных опции. Можно создать SoapExtension, который вставит в ответный поток и получит необработанный XML, или можно изменить тупики прокси для использования XmlElement для получения необработанных значений для доступа в коде.

Для SoapExtension Вы хотите посмотреть здесь: http://www.theserverside.net/tt/articles/showarticle.tss?id=SOAPExtensions

Для XmlElement Вы хотите посмотреть здесь: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.webservices/2006-09/msg00028.html

3
ответ дан 14 December 2019 в 13:50
поделиться

Так, вот способ, которым я закончил тем, что делал его. Сценарий - то, что пользователь нажимает кнопку и хочет видеть необработанный XML, который возвращает веб-сервис. Это даст Вам это. Я закончил тем, что использовал xslt для удаления пространств имен, которые сгенерированы. Если Вы не делаете, Вы заканчиваете с набором раздражающих атрибутов пространств имен в XML.

        // Calling the webservice
        com.fake.exampleWebservice bs = new com.fake.exampleWebservice();
        string[] foo = bs.DummyMethod();

        // Serializing the returned object
        System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(foo.GetType());
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        x.Serialize(ms, foo);
        ms.Position = 0;

        // Getting rid of the annoying namespaces - optional
        System.Xml.XPath.XPathDocument doc = new System.Xml.XPath.XPathDocument(ms);
        System.Xml.Xsl.XslCompiledTransform xct = new System.Xml.Xsl.XslCompiledTransform();
        xct.Load(Server.MapPath("RemoveNamespace.xslt"));
        ms = new System.IO.MemoryStream();
        xct.Transform(doc, null, ms);

        // Outputting to client
        byte[] byteArray = ms.ToArray();
        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment; filename=results.xml");
        Response.AddHeader("Content-Length", byteArray.Length.ToString());
        Response.ContentType = "text/xml";
        Response.BinaryWrite(byteArray);
        Response.End();
3
ответ дан 14 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: