我有一个注入服务的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是好的做法吗?如何设计代码方便测试?在哪里放置验证方法-服务或静态类?
在注入的服务中抛出WebServiceExcture是好的做法吗?
我不会的。
>
打破分层架构规则;较低的级别不应该对较高的级别有任何了解。您应该抛出一个正常的服务级别异常,在资源中捕获异常,然后从那里如果您想换行一个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包含,当然还有构造函数