当前位置: 首页 > 知识库问答 >
问题:

RESTendpoint与注入的服务-在哪里抛出自定义WebServiceExcture?

孟胤
2023-03-14

我有一个注入服务的RESTendpoint。

@Singleton
@Path("/v1/service")
public class MyService {

    @Inject
    private TokenService tokenService;

    @Inject
    private InfoService infoService;

    @GET
    @Path("/info")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public InfoResponse getInfo(@HeaderParam("Authorization") String token){

        tokenService.validateToken(token);

        List<String> info = infoService.getInfo();

        // processing info code, throwing WebServiceException if something wrong

       return new InfoResponse(info);
    }
}

其中一些会验证数据(例如令牌),如果不正确,则会抛出RestServiceExcense异常。异常由ExceptionMapper处理,以便返回适当的响应。其他服务返回/处理信息。

我的自定义异常类与其他字段:

public class RestServiceException extends WebServiceException {

    public Integer httpStatus;

    public String message;
}

示例服务方法:

public User getUser(Long userId){

    User user = userMapper.getUser(userId);

    if (user == null){
        String msg = "Invalid user: " + userId;
        logger.debug(msg);
        throw new RestServiceException(HttpStatus.SC_NOT_FOUND, InternalStatus.INVALID_USER, msg);
    }

    return user;
}

在注入的服务中抛出RestServiceExcture是好的做法吗?如何设计代码方便测试?在哪里放置验证方法-服务或静态类?

共有1个答案

况野
2023-03-14

在注入的服务中抛出WebServiceExcture是好的做法吗?

我不会的。

>

  • 使服务在jax-rs应用程序之外不可重用(对您来说可能没有太大问题)。
  • 打破分层架构规则;较低的级别不应该对较高的级别有任何了解。您应该抛出一个正常的服务级别异常,在资源中捕获异常,然后从那里如果您想换行一个WebApplication ationExc0019,那么就这样做。

    也许仅仅抛出一个WebApplicationException并不被认为是“了解上层”,但我个人认为是这样的,因为异常类型是特定于上层的。

    如何设计代码方便测试?

    使用构造函数注入代替字段注入。如果需要,向资源提供模拟服务会更容易。

    public class MyService {
    
        private final TokenService tokenService;
        private final InfoService infoService;
    
        @Inject
        public MyService(TokenService tokenService,
                         InfoService infoService) {
            this.tokenService = tokenService;
            this.infoService = infoService;
        }
    }
    

    在哪里放置验证方法-服务或静态类?

    这真的没有意义。如果“静态类”是指单例模式单例,那么不肯定不是。使用你目前正在做的控制反转是你更好的选择。

    我想我看错你的问题了。出于某种原因,我将您的WebServiceExc0019读取为JAX-RSWebApplication ationExc0019

    我想我上面提到的规则不适用。但我可能会将异常的名称更改为webserviceeexception以外的名称。这将它与更高的“web”层联系在一起。将异常命名为特定于该服务的名称。

    关于在资源级别处理异常,如果您不想,您不需要对它做任何事情,如果ExceptionMapper正在处理它。或者,如果需要,您可以捕获它并将其包装在WebApplicationException中。

    您可以查看这篇文章的底部,其中列出了所有的子类。如果需要,您可以将异常包装在其中一个中并将其抛出。这些异常都映射到状态代码。

  •  类似资料:
    • 很抱歉提出了一个基本问题,但我还没有找到我的用例的示例。 我有一个定制的spring boot注释,作为基于spring boot的JAR应用程序的一部分提供,因此使用该注释也会触发包扫描。现在,我有了一个使用一些可选参数扩展注释的用例。如果我不知道编写注释的类,如何编写注释解析器。 我的自定义批注如下所示, 使用应用程序时,可以将其放在任何类中,在类级别,而不是在方法级别/字段级别。 我需要找出

    • 问题内容: 我在ASP.Net中有一个WebAPI 2.0项目,在其中实现了自定义的DefaultContractResolver,以便可以控制如何使用JSON.Net将实体序列化为JSON。但是我不确定如何告诉框架使用我的自定义实现。我也想知道是否有可能更改特定控制器/动作的ContractResolver。 谢谢! -–编辑03/07/2014我已经通过创建一个新的ConfigSettings

    • 我将尽量忽略其他细节,并将其简短化: 当在Spring中进行验证时(Spring MVC或使用注入

    • 我找不到那个方法。

    • 我试图通过quarkus的一些教程,在创建一个简单的RESTendpoint时遇到了一个问题。下面是本教程:https://quarkus.io/guides/rest-data-panache。 Im使用指南中的方法创建扩展PanacheEntityResource 的接口 相应的实体是:

    • 我是一名Java编程新手(实际上已经在学习),我对如何处理不同的消息有些怀疑。 我的目标是将这些不同的消息包含在同一个类(CustomExcpse类)中,以避免在从其他类抛出新CustomExceptions的每个方法上一遍又一遍地编写相同的字符串。 到目前为止,我编码: > 一个自定义异常类,它从异常扩展而来,具有不同的消息(在示例中只有两个,但还有更多)作为Strings包含,当然还有构造函数