2012-06-26 18 views
3

공급자가 제공하는 웹 서비스를 사용하려고합니다. 공급자는 요청 xml이 값이없는 태그를 포함해서는 안된다는 것을 엄격하게 검사합니다.Jax-WS - 요청 XML에서 빈 태그를 제거하려면

저는 Jax-WS를 사용하고 있습니다. 특정 개체에 값을 설정하지 않으면 빈 태그로 보내지고 태그가 있습니다. 내 문제를 보여주는 PFB 예제.

클라이언트 XML이에서

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:host="http://host.testing.webservice.com/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <host:testingMathod> 
     <arg0> 
      <PInfo> 
       <IAge>45</IAge> 
       <strName>Danny</strName> 
      </PInfo> 
      <strCorrId>NAGSEK</strCorrId> 
      <strIpAddress></strIpAddress> 
     </arg0> 
     </host:testingMathod> 
    </soapenv:Body> 
</soapenv:Envelope> 

는 IPADDRESS에 대한 값이 제공되지되고 따라서 빈 태그가 전송되어있다.

친절하게도 요청 XML에서 빈 태그를 제거하기 위해 수행해야 할 작업을 알려주세요. Handlerchain이 동일한 솔루션입니까?

감사합니다. Naveen.

+0

아무도이 해결책이 무엇인지 모르십니까? 다른 사람이 대답하기를 원치 않는 것은 너무 간단합니다. 제발 도와주세요. –

+0

필자는 EclipseLink JAXB (MOXy)의 대표이며 도움이 될 답변을 추가했습니다 : http://stackoverflow.com/a/11249220/383861 –

답변

1

이것은 사용중인 XML 시리얼 라이저의 문제입니다 (특별한 작업을하지 않은 경우 JAXB 여야 함).

serializer의 "null 정책"은 구성 가능해야하지만 JAXB에서는 불가능하다고 생각합니다. MOXy을 사용하는 경우 노드가 Null 인 경우 XmlMarshalNullRepresentation.ABSENT_NODE을 사용하여 노드를 쓰지 않아도됩니다.

class MyClass { 

    // ... here are your other attributes 

    @XmlElement (name = "strIpAddress") 
    @XmlNullPolicy(nullRepresentationForXml = XmlMarshalNullRepresentation.ABSENT_NODE) 
    String strIpAddress = null; 

} 

PS : 구현은 다음과 같이해야한다 어쩌면 당신은 또한 @XmlNullPolicyemptyNodeRepresentsNull PARAM을 정의 할 필요가있다.

이 주제에 대한 자세한 내용은 this question

+0

'@ XmlNullPolicy'에 +1. 그러나 문제는 빈 문자열을 포함하는'strIpAddress'와 관련이 있다고 생각합니다. 나는 당신이 열심히하기 때문에 이것이'XmlAdapter'로 해결 될 수있는 방법을 보여주는 대답을 추가했다 : http://stackoverflow.com/a/11249220/383861 –

7

참고하시기 바랍니다 : 나는 EclipseLink JAXB (MOXy) 리드와 JAXB (JSR-222) 전문가 그룹의 구성원입니다. 다른 JAXB 구현과 같은 기본 MOXY으로

는 null 값에 대한 요소를 마샬링하지 않습니다

가능한 문제

을 나는 strIpAddress 속성이 null이 아닌 믿고, 빈 문자열 ("") 값을 포함합니다. 이로 인해 빈 요소가 기록됩니다.

루트

package forum11215485; 

import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 

    String nullValue; 
    String emptyStringValue; 
    String stringValue; 

} 

데모

package forum11215485; 

import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 

     Root root = new Root(); 
     root.nullValue = null; 
     root.emptyStringValue = ""; 
     root.stringValue = "Hello World"; 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(root, System.out); 
    } 

} 

출력

nullValue 필드에 정렬되지 않은 요소가없고 emptyStringValue 필드가 비어있는 요소로 정렬되는 방식에 유의하십시오.

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <emptyStringValue></emptyStringValue> 
    <stringValue>Hello World</stringValue> 
</root> 

해결 방법 # 1 - XmlAdapter

입니다 null로 "-"변환하는 (때문에) XmlAdapter 쓰기

해결 # 2 "속성을 확인합니다"는 널 (null)이 아닌 설정되어 오브젝트를 다른 오브젝트로서 정렬화할 수있는 JAXB기구

StringAdapter

XmlAdapter을 다음은 널 (null)로 빈 문자열을 마샬링합니다. 이로 인해 XML 표현에 나타나지 않게됩니다.

package forum11215485; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class StringAdapter extends XmlAdapter<String, String> { 

    @Override 
    public String unmarshal(String v) throws Exception { 
     return v; 
    } 

    @Override 
    public String marshal(String v) throws Exception { 
     if(null == v || v.length() == 0) { 
      return null; 
     } 
     return v; 
    } 

} 

은 패키지 정보

XmlAdapter@XmlJavaTypeAdapter 주석을 사용하여 중독된다. 다음은 패키지 수준에서 문자열을 후크하는 예제입니다. 따라서 패키지 내의 String 유형의 필드/속성에 적용됩니다. 자세한 내용은 다음을 참조하십시오 http://blog.bdoughan.com/2012/02/jaxb-and-package-level-xmladapters.html

@XmlJavaTypeAdapter(value=StringAdapter.class, type=String.class) 
package forum11215485; 

import javax.xml.bind.annotation.adapters.*; 

이제 출력

데모 코드를 실행의 출력는 다음과 같다

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <stringValue>Hello World</stringValue> 
</root> 
+1

+1!또한 빈 문자열이 있으면 동의합니다. 어댑터는이를 제거하는 방법입니다. – ggarciao

0

이 나를 위해 일한, 클래스를 직렬화 할 때 특수 효과 (LogRecord)를 사용할 수없는 곳 :

  JAXBContext jc = JAXBContext.newInstance(LogRecord.class); 
      JAXBElement<LogRecord> je = new JAXBElement<>(new QName("log"), LogRecord.class, record); 
      Marshaller marshaller = jc.createMarshaller(); 
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
      marshaller.setAdapter(new XmlAdapter<String,String>() { 
       @Override 
       public String marshal(String v) throws Exception { 
        if(null == v || v.length() == 0) { 
         return null; 
        } 
        return v; 
       } 
       @Override 
       public String unmarshal(String v) throws Exception { 
        return v; 
       } 
      }); 
      ByteArrayOutputStream xml = new ByteArrayOutputStream(); 
      marshaller.marshal(je, xml); 
관련 문제