【问题标题】:javax.xml.bind.UnmarshalException: unexpected element even if @XmlRootElement is addedjavax.xml.bind.UnmarshalException:即使添加了@XmlRootElement,也会出现意外元素
【发布时间】:2015-01-04 21:29:38
【问题描述】:

在 SoapUI 中我遇到了这个异常

<faultstring>Unmarshalling Error: unexpected element (uri:"http://ws.soap.rd.pl", local:"User"). Expected elements are &lt;{}User></faultstring>

我真的不知道我为什么会遇到这个问题。我已经尝试过在 Stack 中给出的trip,但仍然找不到答案。 @XmlRootElement 添加了所以我真的很困惑。

请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.soap.rd.pl/" xmlns:ws1="http://ws.soap.rd.pl">
   <soapenv:Header/>
   <soapenv:Body>
      <ws:updateUser>
         <!--Optional:-->
         <ws1:User>
            <ID>?</ID>
            <!--Optional:-->
            <Imie>?</Imie>
            <!--Optional:-->
            <Nazwisko>?</Nazwisko>
            <!--Optional:-->
            <ws1:Adres>
               <!--Optional:-->
               <id>?</id>
               <!--Optional:-->
               <Ulica>?</Ulica>
               <!--Optional:-->
               <Miasto>?</Miasto>
            </ws1:Adres>
         </ws1:User>
      </ws:updateUser>
   </soapenv:Body>
</soapenv:Envelope>

我的 dto:

@XmlRootElement(name = "Adres", namespace = "http://ws.soap.rd.pl")
@XmlAccessorType(XmlAccessType.FIELD)
public class AddressDto {

    @XmlElement(name = "id", required = false)
    public Long id;

    @XmlElement(name = "Ulica", required = false)
    public String street;

    @XmlElement(name = "Miasto", required = false)
    public String city;

    @Override
    public String toString() {
        return "AddressDto [street=" + street + ", city=" + city + "]";
    }

}

第二个:

@XmlRootElement(name = "User", namespace = "http://ws.soap.rd.pl")
@XmlAccessorType(XmlAccessType.FIELD)
public class UserDto {

    @XmlElement(name = "ID")
    public long id;

    @XmlElement(name = "Imie", required = false)
    public String firstName;

    @XmlElement(name = "Nazwisko", required = false)
    public String lastName;

    @XmlElement(name = "Adres", required = false)
    public AddressDto addressDto;

    @Override
    public String toString() {
        return "UserDto [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", addressDto=" + addressDto + "]";
    }

}

如果你需要我的 webService 定义:

@WebService(endpointInterface = "userService", serviceName = "userService", name = "userServive")
public interface UserService {

    @WebMethod
    public void updateUser(@WebParam(name = "User") UserDto user);
}

【问题讨论】:

  • 你检查过你的命名空间 URI 吗?您似乎有 2 个,一个是 ws.soap.rd.pl,另一个是 ws.soap.rd.pl
  • 我应该如何检查它?你的意思是 UserDto 到 nad AddressDto 应该有单独的命名空间?即使他们有我仍然有同样的例外。

标签: java web-services jaxb jax-ws


【解决方案1】:

尝试将targetNamespace 添加到您的@WebParam

@WebMethod
public void updateUser(
    @WebParam(name = "User", targetNamespace = "http://ws.soap.rd.pl")
    UserDto user);

【讨论】:

  • 我已经从每个 dto 类中删除了命名空间,并将 targetNamespace 添加到了 userService 接口,它可以工作。