Olá, amigos,
Gerei meu webservice usando o anotation @WebService e @WebMethod, o wsdl é gerado quando subo a aplicação que esta instalado no jboss e funciona normalmente.
Porém o usuário implicou que a classe Pessoa por exemplo que tem um método por exemplo getDatanascimento() e setDataNascimento(date),
que ele não quer que tenha neste webservice.
Esta classe pessoa além da consulta que retorna a lista de pessoa e a pessoa por Id, esta vinculado por exemplo a lista de endereco onde o endereço possui a objeto pessoa.
Como faço para remover estes metodos já que o wsdl é gerado automáticamente destes métodos.
Desde já agradeço.
Boa noite
a anotação @WebMethod voce pode setar um parametro para que o metodo seja ignorado
ex
@WebMethod(exclude = true)
public Date getDatanascimento(){
return new Date();
}
fazendo isso nos metodos do seu webservice os metodos não serão publicados
mas isso é apenas nos metodos do webservice
no caso da sua classe pessoa por exemplo vc poderia uma outra classe pessoa sem os metodos que o cliente esta reclamando
Boa dia,
Funciona em parte.
Por exemplo na minha classe que criei com o annotation @WebService e que possui os métodos @WebMethod se eu colocar o @WebMethod(exclude=true), realmente este método não retorna o método.
Porém meu problema não é esse, é que o @WebMethod que tenho retorna por exemplo o objeto Usuário com os atributos nome, login e senha.
Eu não quero que o atributo login e senha sejam enviado como resposta do metodo só o objeto Usuário com um único atributo o nome.
Colocando o @WebMethod(exclude=true) nos atributos login e senha ( get e set ) não funcionou.
A ideia de gerar novos objetos com os atributos que eu quero será muito demorada e entendo que assim funcionária.
Vocês teriam outra solução neste caminho indicado com o annotation?
Att
André Cunha
Bom dia Andre,
acredito que vc deve estar usando JAXB com seu WebService
se sua Classe Pessoa estiver anotado com @XmlRootElement vc pode anotar os atributos que deve ter seus valores omitidos com a anotação @XmlTransient
faz um teste e ve o que acontece
Bom dia,
Não estou usuando o annotation @XmlRootElement na classe, coloquei e também no atributo @XmlTransient e também não funcionou. Continua vindo os atributos indesejados.
Alguma outra idéia?
Att
André Cunha
vc pode colocar o codigo do seu webservice e da sua classe pessoa?
Bom dia,
Coloquei o @WebService e @WebMethod(exclude=true) na classe Usuário e não funcionou, os metodos continuam lá.
Alguma outra idéia?
esses anotações so funcionam na classe que sera seu webservice
Então pelo visto, não tem solução com annotation?
montei um webservice aqui
olha como ficou
Minha interface é essa
@WebService
public interface Hello {
Pessoa pessoa();
}
minha implementação
@WebService(endpointInterface = "br.teste.Hello")
public class HelloImp implements Hello{
@Override
public Pessoa pessoa() {
Pessoa pessoa = new Pessoa();
pessoa.setNome("Nome teste");
pessoa.setLogin("Login Teste");
pessoa.setSenha("Senha Teste");
return pessoa;
}
}
minha classe pessoa
@XmlRootElement
@XmlType(name="Pessoa")
@XmlAccessorType(XmlAccessType.FIELD)
public class Pessoa implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String nome;
private String login;
@XmlTransient
private String senha;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
}
minha classe que faz a publicação
public class Publish {
/**
* @param args
*/
public static void main(String[] args) {
Endpoint.publish("http://127.0.0.1:54321/hello", new HelloImp());
}
}
esse é o xsd gerado da classe pessoa com a senha ignorada
<xs:schema version="1.0" targetNamespace="http://teste.br/">
<xs:element name="pessoa" nillable="true" type="xs:anyType"/>
<xs:element name="pessoaResponse" type="tns:pessoaResponse"/>
<xs:complexType name="pessoa">
<xs:sequence/>
</xs:complexType>
<xs:complexType name="pessoaResponse">
<xs:sequence>
<xs:element name="return" type="tns:Pessoa" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Pessoa">
<xs:sequence>
<xs:element name="nome" type="xs:string" minOccurs="0"/>
<xs:element name="login" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
esse é o wsdl do webservice
<definitions targetNamespace="http://teste.br/" name="HelloImpService">
<types>
<xsd:schema>
<xsd:import namespace="http://teste.br/" schemaLocation="http://127.0.0.1:54321/hello?xsd=1" />
</xsd:schema>
</types>
<message name="pessoa">
<part name="parameters" element="tns:pessoa" />
</message>
<message name="pessoaResponse">
<part name="parameters" element="tns:pessoaResponse" />
</message>
<portType name="Hello">
<operation name="pessoa">
<input message="tns:pessoa" />
<output message="tns:pessoaResponse" />
</operation>
</portType>
<binding name="HelloImpPortBinding" type="tns:Hello">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
<operation name="pessoa">
<soap:operation soapAction="" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
<service name="HelloImpService">
<port name="HelloImpPort" binding="tns:HelloImpPortBinding">
<soap:address location="http://127.0.0.1:54321/hello" />
</port>
</service>
</definitions>
não sei se é assim que vc esta fazendo, mas aqui funcionou. se for retirado o @XmlTransient do atributo senha ele irá aparecer no xsd
O que estava faltando na minha classe era
@XmlRootElement
@XmlType(name=“Pessoa”)
@XmlAccessorType(XmlAccessType.FIELD)
e com isso:
@XmlTransient
private String senha;
funcionou.
Muito Obrigado.