Duvida em sub-modelos de transporte wrapped.

43 views
Skip to first unread message

Diego Sousa

unread,
Aug 9, 2013, 5:19:54 PM8/9/13
to soa-ap...@googlegroups.com
Olá Pessoal,

Alguém saberia explicar o motivo do JAXB não realizar o unmarshal dos objetos "pai" que são parâmetros dos métodos do WS (@WebMethod), como por exemplo, a classe do livro do Capítulo 7 "SolicitarRelacaoDeAutores", quando estamos utilizando o sub-modelos de transporte WRAPPED? Nesse modelo percebi que o JAXB apenas faz unmarshal dos atributos das classes.

Utilizando o exemplo do cap 7 (soa-cap07-wsaddressing-servidor), temos:

@Override

@WebMethod(action = "AutoresService/SolicitarRelacaoDeAutores")

@WebResult(name = "autor", targetNamespace = "")

@RequestWrapper(localName = "solicitarRelacaoDeAutores", targetNamespace = "http://knight.com/estoque/services/AutoresService/v1", className = "com.knight.estoque.services.autoresservice.v1.SolicitarRelacaoDeAutores")

@ResponseWrapper(localName = "solicitarRelacaoDeAutoresResponse", targetNamespace = "http://knight.com/estoque/services/AutoresService/v1", className = "com.knight.estoque.services.autoresservice.v1.SolicitarRelacaoDeAutoresResponse")

@Action(input = " ", output = "AutoresService/solicitarRelacaoDeAutoresResponse")

//@Addressing(enabled = true, required = true) 

public List<Autor> solicitarRelacaoDeAutores(
@WebParam(name = "desde", targetNamespace = "")    XMLGregorianCalendar desde) {
Autor alexandre = new Autor();
alexandre.setNome("Alexandre Saudate");

Autor adriano = new Autor();
adriano.setNome("Adriano Almeida");

Autor paulo = new Autor();
paulo.setNome("Paulo Silveira");

return new ArrayList<Autor>(Arrays.asList(alexandre, adriano, paulo));
}

Se no lugar do "XMLGregorianCalendar", for utilizando o objeto "SolicitarRelacaoDeAutores" que contém o "XMLGregorianCalendar desde", o objeto SolicitarRelacaoDeAutores continua sendo "null" após a requisição, ou seja, pelo que entendi ele não conseguiu fazer o unmarshall.

Obs: No modo BARE a conversão é realizada com sucesso e o objeto "SolicitarRelacaoDeAutores" é instanciado e todos os seus atributos são preenchidos.

Agradeço antecipadamente.

[]'s

--
-------------------------------------------------------------------------------
Diego Sousa de Azevedo
--------------------------------------------------------------------------------
"I like the impossible because there is less competition"
Walt Disney

Alexandre Saudate

unread,
Aug 9, 2013, 5:33:02 PM8/9/13
to soa-ap...@googlegroups.com
Diego, 

O caso é que esse objeto é especialmente modelado para contratos do tipo document-literal wrapped. O JAX-WS é inteligente o suficiente para detectar que não é uma classe de negócio, mas sim, apenas um apoio ao desenvolvimento.

No modo BARE, o que acontece é a mudança do tipo de contrato, ou seja, ele passa a ser apenas document literal. Neste contexto, você imediatamente passa a associar esta classe ao negócio e, portanto, o JAX-WS faz o parse da classe e entrega o input para o método. 

Mas... que mal lhe pergunte, qual o objetivo da questão?

[]'s


--
Você está recebendo esta mensagem porque se inscreveu no grupo "SOA Aplicado" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para soa-aplicado...@googlegroups.com.
Para postar neste grupo, envie um e-mail para soa-ap...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/soa-aplicado.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Diego Sousa

unread,
Aug 12, 2013, 9:30:35 AM8/12/13
to soa-aplicado
Olá Alexandre, primeiramente obrigado pela resposta.

Meu objetivo é desenvolver um serviço que utilize do modo Wrapped e que seja passado como parâmetro o objeto (classe) e não seus atributos. Apenas consegui isso utilizando o modo BARE. No modo Wrapped sou obrigado a utilizar os atributos da classe, o que acredito em alguns casos não ser uma boa prática, já que nos casos em que tenhamos vários atributos teríamos que passar todos eles como parâmetro.

Meu exemplo:

Abaixo a entidade que pretendo passar como parâmetro:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "input", propOrder = {
    "iCabecMsg",
    "iDadosMsg"
})
public class Input {
    @XmlElement(required = true)    
    protected String iCabecMsg;
    @XmlElement(required = true)
    protected String iDadosMsg;

//Gets e Sets omitidos. Nenhum deles possui qualquer anotação.

}

Abaixo o serviço (Interface):

@WebService(targetNamespace = "http://ws.test.org.br", name = "wsTest")
@XmlSeeAlso({ObjectFactory.class})
@SOAPBinding(parameterStyle = ParameterStyle.WRAPPED, style = Style.DOCUMENT, use = Use.LITERAL)
public interface Ws {

//1° Forma
@RequestWrapper(localName = "AddRequest", className = "Input", targetNamespace = "http://ws.test.org.br")
@ResponseWrapper(localName= "AddResponse", className = "Output", targetNamespace = "http://ws.test.org.br")
@WebResult(name = "AddResponse", targetNamespace = "http://ws.test.org.br", partName = "parameters")
@WebMethod(operationName = "Add", action = "http://ws.test.org.br/Add")

//Dessa forma, passando como parâmetro o objeto Input o unmarshall não é realizado.
public Output add(
        @WebParam(partName = "parameters", name = "AddRequest", targetNamespace = "http://ws.test.org.br")
        Input parameters
);

//2° Forma
@RequestWrapper(localName = "AddRequest", className = "Input", targetNamespace = "http://ws.test.org.br")
@ResponseWrapper(localName= "AddResponse", className = "Output", targetNamespace = "http://ws.test.org.br")
@WebResult(name = "outputXML", targetNamespace = "http://ws.test.org.br"partName = "parameters", )
@WebMethod(operationName = "Add", action = "http://ws.test.org.br/Add")

//Dessa forma, passando como parâmetro os atributos (iCabecMsg e iDadosMsg) do objeto Input o //unmarshall é realizado.
public String add
    @WebParam(partName = "parameters", name = "iCabecMsg", targetNamespace = "http://ws.test.org.br") String iCabecMsg,
@WebParam(partName = "parameters", name = "iDadosMsg", targetNamespace = "http://ws.test.org.br") String iDadosMsg );

}

}

Teria alguma ideia de como utilizar como parâmetro apenas o objeto Input ao invés de todos os seus atributos?

[]'s


2013/8/9 Alexandre Saudate <alesa...@gmail.com>

Alexandre Saudate

unread,
Aug 12, 2013, 12:26:43 PM8/12/13
to soa-ap...@googlegroups.com
Bom dia, Diego

Parte de uma boa modelagem SOA é utilizar objetos como parâmetros, ao invés de seus atributos. Ou seja, considere o seguinte exemplo:

public Pessoa criarPessoa (String nome, Date dataNascimento);

Para que este exemplo seja mais flexível em termos de modelagem, o ideal é passar como parâmetro diretamente a entidade pessoa, ou seja:

public Pessoa criarPessoa (Pessoa pessoa);

Assim, considero que o ideal, no seu caso, seria modelar desta forma. Da maneira como você está descrevendo o problema, dá a entender que existem grandes chances do serviço ter sido mal modelado, e caberia modelar desta forma (veja o cap. 7 do livro, sobre modelo canônico). 

Se não houver esta possibilidade, você não tem opção - precisa deixar no modo document style (BARE). 

[]'s
Reply all
Reply to author
Forward
0 new messages