[
https://issues.apache.org/jira/browse/THRIFT-1871?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13595180#comment-13595180
]
Eirik Sletteberg commented on THRIFT-1871:
------------------------------------------
I submitted a patch, suggesting a change in the IDL. It's fully
backwards-compatible.
The patch adds an optional modifier keyword to functions: "nullable". For
example:
Service MyService {
nullable string getUsername(1: i32 id);
}
If no user with this ID is found in the database, the function can return an
empty result.
How this is handled will be up to the code generators. For now, it's simply
ignored.
A natural implementation for this change (say, in the java code generator)
would be to wrap the result in an Option type, like explained above.
> Better null-safe handling
> -------------------------
>
> Key: THRIFT-1871
> URL: https://issues.apache.org/jira/browse/THRIFT-1871
> Project: Thrift
> Issue Type: Brainstorming
> Components: Compiler (General)
> Reporter: Eirik Sletteberg
> Attachments: Add_nullable_modifier_to_functions.patch
>
>
> Optional fields are not really handled well, especially in java clients.
> (NullPointerExceptions everywhere)
> Scrooge (Twitter's alternative Thrift compiler implementation) solves this
> problem by wrapping all optional fields in an Option<T> class. Could this be
> implemented in Thrift?
> As of today, services have no way of returning empty results; for example
> UserService {
> 1: User getUser(1: i32 id)
> }
> cannot return an empty user if the ID is not found.
> There are a few ways to solve this:
> UserService {
> 1: User getUser(1: i32 id) throws UserNotFoundException
> }
> -- or --
> UserService {
> 1: List<User> getUser(1: i32 id)
> }
> where an empty list is returned of no user is found, and a list containing
> one item is returned if a user is found.
> -- or --
> UserResult {
> 1: bool exists;
> 2: User user;
> }
> UserService {
> 1: UserResult getUser(1: i32 id)
> }
> I don't like any of them.
> One could solve this by letting the "optional" keyword apply to methods:
> UserService {
> 1: optional User getUser(1: i32 id)
> }
> or adding a new type to the IDL; the Option type:
> UserService {
> 1: Option<User> getUser(1: i32 id)
> }
> and then, like Scrooge does, generate code that wraps the optional fields in
> an "Option" type, which is null-safe.
> The Option type could also be used in structs:
> struct User {
> 1: i32 id;
> 2: string name;
> 3: optional string email;
> }
> -- or --
> struct User {
> 1: i32 id;
> 2: string name;
> 3: Option<string> email;
> }
> Either way, a null-safe Option wrapper would be used in the generated java
> code.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira