【发布时间】:2019-08-04 12:46:29
【问题描述】:
我正在使用 vavr 的 Either 来控制我的应用程序的流程,它运行良好,直到我不必混合几个域...
首先,我有一个在域之间共享的接口。
public interface DomainError {
String getCause();
}
同样的成功,当我只是想通知用户并且不需要返回特定对象时。
@RequiredArgsConstructor
@Getter
public class SuccessMessage {
private final String message;
}
现在,每个域都像这样实现DomainError
public enum UserError implements DomainError {
USERNAME_ALREADY_EXISTS("Username already exists"),
INVALID_EMAIL("Provided email address is invalid");
private final String cause;
UserError(String cause) {
this.cause = cause;
}
@Override
public String getCause() {
return cause;
}
}
类似地,它会查找 EmailError,其中只有另一个值。现在,我有EmailFacade
public class EmailFacade {
private final SendEmailUseCase sendEmail;
private final CreateEmailUseCase createEmail;
public Either<DomainError, SuccessMessage> sendUserVerificationEmail(UUID uuid, String receiver) {
return sendEmail.send(createEmail.createUserVerificationEmail(uuid, receiver));
}
}
其中一项服务返回
class SendEmailUseCase {
Either<DomainError, SuccessMessage> send(EmailMessage message) {
if(message == null) return Either.left(EmailError.EMPTY_MESSAGE);
log.info(message.toString());
return Either.right(new SuccessMessage("Email sent"));
}
}
现在,我需要从处理用户注册的其他域调用它。
为了做到这一点,我写了这个方法
Either<DomainError, SuccessMessage> register(RegisterUserDto registerUserDto) {
if(userRepository.findUser(registerUserDto.getUsername()).isPresent())
return Either.left(UserError.USERNAME_ALREADY_EXISTS);
Either<DomainError, User> userCreationResult = User.createUser(registerUserDto);
return userCreationResult
.map(user -> {
userRepository.save(user.toDto());
final UUID uuid = verificationTokenRepository.generateVerificationToken(user.getUsername());
return emailFacade.sendUserVerificationEmail(uuid, user.getUsername());
});
}
我在这里做的事情很少,但相关部分是最后一个 return 语句,以上所有内容都在工作。 emailFacade.sendUserVerificationEmail() 返回Either<DomainError, SuccessMessage>,与register() 方法相同。但是由于某种原因,我收到了这个错误
错误:(28, 17) java: 不兼容的类型: 推断变量 U 有 不相容的界限 等式约束:com.johndoe.myapp.domain.SuccessMessage 下界:
io.vavr.control.Either<com.johndoe.myapp.domain.DomainError,com.johndoe.myapp.domain.SuccessMessage>
我真的无法理解这里出了什么问题......
【问题讨论】:
-
阅读 javadoc:static.javadoc.io/io.vavr/vavr/1.0.0-alpha-3/io/vavr/control/…。 map() 需要一个将正确值转换为另一个正确值的函数。不是将正确值转换为 Either 的函数。阅读剩余的 javadoc 应该可以帮助您找出真正需要调用的内容。