yudaocode/SpringBoot-Labs · warning · ServiceException
1001002001
1001002001
Error message
用户已存在
What it means
Deliberate ServiceException (code 1001002001, USER_EXISTS) thrown by the Dubbo provider in labx-07 demo04, which demonstrates Dubbo Filters. When UserService.add is called with the name 'yudaoyuanma', the provider throws ServiceException constructed from ServiceExceptionEnum.USER_EXISTS; the accompanying AccessContextFilter / GlobalExceptionHandler machinery in the demo shows how a custom Dubbo filter can unwrap ServiceException on the consumer side and rethrow it with the original code+message.
Source
Thrown at labx-07-spring-cloud-alibaba-dubbo/labx-07-sca-dubbo-demo04-filter/labx-07-sca-dubbo-demo04-provider/src/main/java/cn/iocoder/springcloudalibaba/labx7/providerdemo/service/UserServiceImpl.java:23
import cn.iocoder.springcloudalibaba.labx7.core.ServiceExceptionEnum;
import cn.iocoder.springcloudalibaba.labx7.dto.UserAddDTO;
import cn.iocoder.springcloudalibaba.labx7.dto.UserDTO;
@org.apache.dubbo.config.annotation.Service(protocol = "dubbo", version = "1.0.0", validation = "true", filter = "-exception")
public class UserServiceImpl implements UserService {
@Override
public UserDTO get(Integer id) {
return new UserDTO().setId(id)
.setName("没有昵称:" + id)
.setGender(id % 2 + 1); // 1 - 男;2 - 女
}
@Override
public Integer add(UserAddDTO addDTO) {
// 【额外添加】这里,模拟用户已经存在的情况
if ("yudaoyuanma".equals(addDTO.getName())) {
throw new ServiceException(ServiceExceptionEnum.USER_EXISTS);
}
return (int) (System.currentTimeMillis() / 1000); // 嘿嘿,随便返回一个 id
}
}
View on GitHub (pinned to 6c12efaed0)
Solutions
- Call add with any name other than 'yudaoyuanma' to get the success path.
- On the consumer, ensure the demo's Dubbo filter is loaded (scan/activate it) so ServiceException is deserialized with code 1001002001 intact.
- If you extended this into real code, replace the hard-coded check with a real uniqueness check and return the same ServiceException shape.
Example fix
// before
if ("yudaoyuanma".equals(addDTO.getName())) {
throw new ServiceException(ServiceExceptionEnum.USER_EXISTS);
}
// after — real duplicate check keeping the same error contract
if (userMapper.selectByName(addDTO.getName()) != null) {
throw new ServiceException(ServiceExceptionEnum.USER_EXISTS);
} Defensive patterns
Strategy: try-catch
Validate before calling
// Avoid the reserved duplicate name before the RPC
if ("yudaoyuanma".equals(addDTO.getName())) {
return Result.error(1001002001, "用户已存在"); // don't call the provider
} Try / catch
// Consumer side with the demo's filter active, ServiceException arrives typed:
try {
Integer id = userService.add(addDTO);
} catch (ServiceException e) {
if (e.getCode() == 1001002001) {
return Result.error(e.getCode(), e.getMessage()); // 用户已存在
}
throw e;
} catch (RuntimeException e) {
// without the filter, ServiceException may arrive wrapped — unwrap and inspect
if (e.getCause() instanceof ServiceException) { /* handle code */ }
throw e;
} Prevention
- Never use the demo's reserved name 'yudaoyuanma' as test data for add().
- Register the demo's Dubbo consumer filter so ServiceException keeps its code across RPC.
- Match ServiceException on both ends via a shared API jar to avoid wrap/unwrap surprises.
When it happens
Trigger: RPC call UserService.add(new UserAddDTO().setName("yudaoyuanma")) — any other name returns a fake id; the special name is hard-coded to simulate a duplicate-user conflict.
Common situations: Running the demo04 integration test or tutorial curl that uses the reserved name; forgetting this sentinel value exists and reusing it as real test data; consumers not registering the demo's filter so the ServiceException arrives wrapped in RuntimeException and loses its code.
Related errors
AI-assisted analysis of yudaocode/SpringBoot-Labs@6c12efaed0 (2026-08-14).
Data as JSON: /api/errors/af5c9c0a7e8a4abd.
Report an issue: GitHub.