1
resposta

Funciona com a nova api de datas do pacote java.time ?

Utilizando a data do tipo java.util.Date funciona exatamente como mostrado. Porém testando com as classes java.time.LocalDate e java.time.LocalDateTime a data do erro não está sendo informada nos detalhes do Fault. O JAX-WS funciona coma nova api de datas ou estou fazendo algo erado? Segue o código:

Exceção contendo o método getFaultInfo():

@WebFault(name = "AutorizacaoFault", messageName="AutorizacaoFault") 
public class AutorizacaoException extends Exception {

    public AutorizacaoException(String msg) {
        super(msg);
    }

    public FaultInfo getFaultInfo() {
        return new FaultInfo("Token inválido.", LocalDateTime.now());
    }
}

Implementação da classe FaultInfo utilizando java.time.LocalDateTime:

@XmlAccessorType(XmlAccessType.FIELD)
public class FaultInfo {

    private String mensagem;
    private LocalDateTime dataErro;

    FaultInfo() {
    }

    public FaultInfo(String mensagem, LocalDateTime dataErro) {
        this.mensagem = mensagem;
        this.dataErro = dataErro;
    }
}

O request do soap:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.estoque.caelum.com.br/">
   <soapenv:Header>
      <ws:tokenUsuario>
         <dataValidade></dataValidade>
         <token>ZZZ</token>
      </ws:tokenUsuario>
   </soapenv:Header>
   <soapenv:Body>
      <ws:cadastrarItem>
         <item>
            <codigo></codigo>
            <nome></nome>
            <quantidade></quantidade>
            <tipo></tipo>
         </item>
      </ws:cadastrarItem>
   </soapenv:Body>
</soapenv:Envelope>

O response do soap:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
         <faultcode>S:Server</faultcode>
         <faultstring>Token Inválido.</faultstring>
         <detail>
            <ns2:AutorizacaoFault xmlns:ns2="http://ws.estoque.caelum.com.br/">
               <mensagem>Token inválido.</mensagem>
               <dataErro/>
            </ns2:AutorizacaoFault>
         </detail>
      </S:Fault>
   </S:Body>
</S:Envelope>

Aqui o problema, o atributo dataErro está vindo numa tag fechada sem conter qualquer informação sobre a data do erro, quando utilizo LocalDate ou LocalDateTime. Deveria funcionar?

1 resposta

Olá Christian,

Você precisa criar um adaptador para a classe LocalDateTime:

public class LocalDateTimeAdapter extends XmlAdapter<String, LocalDateTime> {
    public LocalDateTime unmarshal(String v) throws Exception {
        return LocalDateTime.parse(v);
    }

    public String marshal(LocalDateTime v) throws Exception {
        return v.toString();
    }
}

e anotar o campo conforme a seguir:

@XmlJavaTypeAdapter(value = LocalDateTimeAdapter.class)
private LocalDateTime dataErro;

Espero ter ajudado.