Пользовательская обработка исключений - Java Web Services - PullRequest
5 голосов
/ 06 декабря 2011

Это моя первая публикация здесь, поэтому, пожалуйста, будьте терпеливы и исправляйте меня, когда это необходимо ...

Я создаю простое приложение на основе веб-службы с использованием NetBeans и GlassFish. NetBeans действительно очень помогает с точки зрения генерации кода для новых веб-сервисов и их операций, хотя одна вещь сводит меня с ума - обработка исключений веб-сервисов. Операция как:

@WebMethod(operationName = "checkUserExist")
public String checkUserExist(@WebParam(name = "login") String login, @WebParam(name = "password") String password) throws LoginException {

    String auth_code = "";
    bk_end.Validate val = new bk_end.Validate();

    boolean isValidated = val.check(login, password);

    if(isValidated)
    {
        auth_code = val.return_AuthCode();
        bank_services.CustomerSerice.setAuth_Code(auth_code);
        return auth_code;
    }

    throw new LoginException("Something is wrong!");

}

и класс исключений:

public class LoginException extends Exception
{
    String message;


    public LoginException(String message)
    {
        super();
        this.message = message;
    }

    public String getErrorMessage()
    {
        return this.message;
    }
}

бросает массивный Подробности исключений: java.lang.reflect.InvocationTargetException плюс тонны других исключений .. Я понимаю, что это очень непростой вопрос, но после многих часов попыток сделать разные вещи, я просто не знаю, что делать. Я читал о @WebFault, но не знал, как правильно указать это (прикрепить мое исключение к определенному методу ..)

Пожалуйста, помогите, все идеи приветствуются!

Исключения, которые я получаю: При вызове службы возникла исключительная ситуация с сообщением: null; Обратитесь к журналу сервера для более подробной информации

Exceptions details : java.lang.reflect.InvocationTargetException
javax.servlet.ServletException: java.lang.reflect.InvocationTargetException
    at org.glassfish.webservices.monitoring.WebServiceTesterServlet.doPost(WebServiceTesterServlet.java:330)
    at org.glassfish.webservices.monitoring.WebServiceTesterServlet.invoke(WebServiceTesterServlet.java:106)
    at org.glassfish.webservices.EjbWebServiceServlet.service(EjbWebServiceServlet.java:114)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    at com.sun.grizzly.http.servlet.ServletAdapter$FilterChainImpl.doFilter(ServletAdapter.java:1002)
    at com.sun.grizzly.http.servlet.ServletAdapter$FilterChainImpl.invokeFilterChain(ServletAdapter.java:942) 
    at com.sun.grizzly.http.servlet.ServletAdapter.doService(ServletAdapter.java:404)
    ...
Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.glassfish.webservices.monitoring.WebServiceTesterServlet.doPost(WebServiceTesterServlet.java:301)
    ... 24 more
Caused by: bank_services.LoginException_Exception: excepts.LoginException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:145)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:123)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:144)
    at $Proxy383.checkUserExist(Unknown Source) ... 29 more             

1 Ответ

4 голосов
/ 06 декабря 2011

О, хорошо. Вы хотите увидеть сообщение "Что-то не так".

Так что я думаю, что главная проблема здесь в том, что вы не используете стандартное поле detailMessage в Throwable. Если вы просто передадите сообщение в базовый класс (super(message);), то держу пари, что вы увидите исключение в трассировке. Вы пробовали другой тип Exception, например, просто Exception?

Вы также можете определить LoginException.toString() как что-то вроде:

@Override
public String toString() {
    String s = getClass().getName();
    return (message != null) ? (s + ": " + message) : s;
}

В качестве альтернативы вам нужно будет сделать что-то вроде этого:

try {
    ...
} catch (Exception e) {
    if (e instanceof ServletException) {
        e = e.getCause();
    }
    if (e instanceof InvocationTargetException) {
        e = e.getCause();
    }
    if (e instanceof LoginException) {
        System.err.println("Login exception returned message: "
            + ((LoginException)e). getErrorMessage());
    } else {
        System.err.println("Exception returned message: " + e);
    }
}

Но я думаю, что я рекомендую использовать super(message); в вашем конструкторе.

...