Search code examples
javaweb-servicesjax-wsglassfish-3

How to make JAX-WS webservice respond with specific http code


Just like the title says.

    @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

    }

Is there anyway I can make a method return a specific HTTP code on demand? I know that some of the stuff, like authentication, internal server errors , etc make the the WS method return 500 and auth errors , but I would like to be able to send these in accordance with by business logic.

Anyone done this before? Been using jax-WS for some time and this was the first time I had this need, tried searching for it and couldn't find an answer anywhere.

Thanks


Solution

  • Only get the current instance of javax.servlet.http.HttpServletResponse and sends the error.

    @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!";
        }
    
    }
    

    See also List of HTTP status codes - Wikipedia, the free encyclopedia