通过返回值公开服务或抛出异常

时间:2014-11-07 12:32:08

标签: java design-patterns

我想将服务定义为Web服务。 我用register名称定义了一个方法。它是一个类作为输入参数,名称为RegisterParam,返回类型为RegisterResult名称作为输出。

public class RegisterParam{
      String name;
      String family;
}

public class RegisterResult{
      Integer registr_id;
}

public interface Service{
      public RegisterResult register(RegistrParam param);
}

如果注册服务失败且其逻辑没有这样做,我有两个解决方案用于通知服务调用者:

  1. 在RegisterResult类中,添加一个属性result_code,并为其值添加一个枚举。如果其值为零则意味着注册服务器成功完成,如果其值为零,则表示注册服务失败,result_code显示失败原因。

  2. 注册服务在被剔除时抛出异常,并且如果没有任何异常抛出意味着注册服务成功完成。

  3. 我的问题是:上面的解决方案是什么,为什么?

2 个答案:

答案 0 :(得分:0)

我认为你应该区分两种不同的情况:

1)发生异常,就像某些环境(例如数据库)不可用一样。 在这种情况下,我会抛出一个异常,它由Web服务实现自动转换为SOAPFault。这个的优点是,你的服务的调用者也是一个例外,可以通过它的异常处理来处理它。

2)预期的业务“错误”发生,例如用户未登录或未提供必要信息以使服务成功完成。 您的Web服务的调用者会收到一条响应消息,调用者必须将其解释,并且可能希望将其显示给提供该信息的用户。

最后,它取决于您提供给界面用户的界面合约!最重要的是描述您的服务如何处理不同的错误情况。

答案 1 :(得分:0)

案例1无结果:

public interface Service{
    public void register(RegistrParam param);
}

在这种情况下,您的服务可以发送类似200的HTTP Status Code。您的客户将以这种方式解释状态代码:

  • 200:好的,我注册了
  • 400:嗯,不知道为什么但是失败了......

如果您想了解发生了什么以及为什么您的请求因400错误而失败,您必须检查服务器日志或类似内容。

案例2,结果:

public interface Service{
    public Response register(RegistrParam param);
}

我总是向客户发送一个Response对象:

public class Response {

    private ResponseStatus status;     // enum: (OK, ERROR, BAD_REQUEST)
    private ResultType     type;       // enum: (RegisterResult, LoginResult etc...) defines how to interpret the field "data"
    private Object         data;       // RegisterResult.java as jsonstring or Exception.java as jsonstring etc...
    private long           time = -1L; // execution time

}

如果我正在开发我的客户,我总能理解为什么我的请求失败了。