Bean Validationを適切に機能させるために、PascalThiventの回答で提供されている例を次のように書き直すことができます。
@ValidAddress
public class Address {
    @NotNull
    @Size(max = 50)
    private String street1;
    @Size(max = 50)
    private String street2;
    @NotNull
    @Size(max = 10)
    private String zipCode;
    @NotNull
    @Size(max = 20)
    private String city;
    @Valid
    @NotNull
    private Country country;
    
}
public class Country {
    @NotNull
    @Size(min = 2, max = 2)
    private String iso2;
    
}
@Documented
@Target(TYPE)
@Retention(RUNTIME)
@Constraint(validatedBy = { MultiCountryAddressValidator.class })
public @interface ValidAddress {
    String message() default "{com.example.validation.ValidAddress.message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
public class MultiCountryAddressValidator 
       implements ConstraintValidator<ValidAddress, Address> {
    public void initialize(ValidAddress constraintAnnotation) {
    }
    @Override
    public boolean isValid(Address address, 
                           ConstraintValidatorContext constraintValidatorContext) {
        Country country = address.getCountry();
        if (country == null || country.getIso2() == null || address.getZipCode() == null) {
            return true;
        }
        switch (country.getIso2()) {
            case "FR":
                return 
            case "GR":
                return 
            default:
                return true;
        }
    }
}