2013-10-10 15 views
5

Proprio come dice il titolo.Come far funzionare il servizio web JAX-WS con uno specifico codice http

@WebService(
     targetNamespace = "http://com.lalaland.TestWs", 
     portName = "TestWs", 
     serviceName = "TestWs") 
public class TestWs implements TestWsInterface { 

    @EJB(name="validator") 
    private ValidatorLocal validator; 

    @WebMethod(operationName = "getStuff") 
    public List<StuffItem> getStuff(@WebParam(name = "aaa")String aaa, 
         @WebParam(name = "bbb")int bbb) { 

      if (! validator.check1(...)) 
       return HTTP code 403  <------------ Here 
      if (! validator.check2(...)) 
       return HTTP code 404  <------------ Here 
      if (! validator.check3(...)) 
       return HTTP code 499  <------------ Here 

      return good list of Stuff Items 

    } 

Esiste comunque un metodo per restituire un codice HTTP specifico su richiesta? So che alcune delle cose, come l'autenticazione, gli errori interni del server, ecc. Fanno sì che il metodo WS restituisca 500 e gli errori di autenticazione, ma vorrei poterli inviare secondo la logica aziendale.

Qualcuno ha già fatto questo? Ho usato jax-WS da un po 'di tempo e questa è stata la prima volta che ho avuto questo bisogno, ho provato a cercarlo e non ho trovato una risposta da nessuna parte.

Grazie

+0

Solo per completezza, ho già provato: throw new javax.xml.ws.http.HTTPException (123) e non ha funzionato – SysHex

+0

quale stai usando: metro o cxf? – Sergio

+0

@Chechus viene distribuito su Glassfish 3, quindi metro, ho dimenticato di menzionarlo e ho appena inserito il tag glassfish-3 – SysHex

risposta

9

ottenere solo l'istanza corrente di javax.servlet.http.HttpServletResponse e invia l'errore.

@WebService 
public class Test { 

    private static final Logger LOG = Logger.getLogger(Test.class.getName()); 

    @Resource 
    private WebServiceContext context; 

    @WebMethod(operationName = "testCode") 
    public String testCode(@WebParam(name = "code") int code) { 
     if (code < 200 || code > 299) { 
      try { 
       MessageContext ctx = context.getMessageContext(); 
       HttpServletResponse response = (HttpServletResponse) 
         ctx.get(MessageContext.SERVLET_RESPONSE); 
       response.sendError(code, code + " You want it!"); 
      } catch (IOException e) { 
       LOG.severe("Never happens, or yes?"); 
      } 
     } 
     return code + " Everything is fine!"; 
    } 

} 

Vedi anche List of HTTP status codes - Wikipedia, the free encyclopedia

+0

Funziona! Grazie Paul – SysHex

+1

Prego. Non dimenticare che se una risposta risolve la tua domanda in modo soddisfacente, puoi [accettarla] (http://meta.stackexchange.com/a/5235/227183). –

2

Prova questa:

Creare un SOAPHandler come questo: http://www.mkyong.com/webservices/jax-ws/jax-ws-soap-handler-in-server-side/ che implementa l'interfaccia: Handler.handleResponse();

poi, all'interno del gestore si è Disponibile per modificare a piacere le intestazioni HTTP, in modo da poter aggiungere qualcosa come: http://download.java.net/jdk7/archive/b123/docs/api/javax/xml/ws/handler/MessageContext.html

Dove è possibile utilizzare il: HTTP_RESPONSE_CODE come si desidera.

Other resource: http://docs.oracle.com/cd/E14571_01/web.1111/e13735/handlers.htm

Suggerimento: pensate a come soaphandlers intercettori per i messaggi di sapone

+0

Provalo ora. Vi dirò in un minuto o due – SysHex

+0

da ** Handler.handleResponse(); ** intendete handleMessage()? Impossibile trovare la firma per handleResponse. – SysHex

+1

troverai come farlo nel tutorial di Oracle, ma in realtà la risposta di Paul è piuttosto pulita, provalo se hai solo bisogno di cambiare i codici di risposta http. – Sergio