{title:'Java Method Return Types', updated:'9.0.0'}

The return type of the Java method can be any serializable POJO as defined in POJO Categories. It can also be void if the method is not sending any output (e.g. a request redirect) or is setting the output using the {@link oajr.RestResponse#setContent(Object)} method.

##### Example:

| @RestGet | public String doGet() { | return "Hello World!"; | }

In addition to POJOs, the following return types are also supported:

- Parameters based on class types:
  - Direct streams:
    - {@link java.io.InputStream}
    - {@link java.io.Reader}
  - Apache HttpComponent beans:
    - {@link org.apache.http.HttpEntity}
    - {@link oaj.http.resource.HttpResource}
    - {@link org.apache.http.HttpResponse}
  - Standard HTTP response beans:
    - {@link oaj.http.response.Accepted}
    - {@link oaj.http.response.AlreadyReported}
    - {@link oaj.http.response.BadRequest}
    - {@link oaj.http.response.Conflict}
    - {@link oaj.http.response.Continue}
    - {@link oaj.http.response.Created}
    - {@link oaj.http.response.EarlyHints}
    - {@link oaj.http.response.ExpectationFailed}
    - {@link oaj.http.response.FailedDependency}
    - {@link oaj.http.response.Forbidden}
    - {@link oaj.http.response.Found}
    - {@link oaj.http.response.Gone}
    - {@link oaj.http.response.HttpVersionNotSupported}
    - {@link oaj.http.response.IMUsed}
    - {@link oaj.http.response.InsufficientStorage}
    - {@link oaj.http.response.InternalServerError}
    - {@link oaj.http.response.LengthRequired}
    - {@link oaj.http.response.Locked}
    - {@link oaj.http.response.LoopDetected}
    - {@link oaj.http.response.MethodNotAllowed}
    - {@link oaj.http.response.MisdirectedRequest}
    - {@link oaj.http.response.MovedPermanently}
    - {@link oaj.http.response.MultipleChoices}
    - {@link oaj.http.response.MultiStatus}
    - {@link oaj.http.response.NetworkAuthenticationRequired}
    - {@link oaj.http.response.NoContent}
    - {@link oaj.http.response.NonAuthoritiveInformation}
    - {@link oaj.http.response.NotAcceptable}
    - {@link oaj.http.response.NotExtended}
    - {@link oaj.http.response.NotFound}
    - {@link oaj.http.response.NotImplemented}
    - {@link oaj.http.response.NotModified}
    - {@link oaj.http.response.Ok}
    - {@link oaj.http.response.PartialContent}
    - {@link oaj.http.response.PayloadTooLarge}
    - {@link oaj.http.response.PermanentRedirect}
    - {@link oaj.http.response.PreconditionFailed}
    - {@link oaj.http.response.PreconditionRequired}
    - {@link oaj.http.response.Processing}
    - {@link oaj.http.response.RangeNotSatisfiable}
    - {@link oaj.http.response.RequestHeaderFieldsTooLarge}
    - {@link oaj.http.response.ResetContent}
    - {@link oaj.http.response.SeeOther}
    - {@link oaj.http.response.ServiceUnavailable}
    - {@link oaj.http.response.SwitchingProtocols}
    - {@link oaj.http.response.TemporaryRedirect}
    - {@link oaj.http.response.TooManyRequests}
    - {@link oaj.http.response.Unauthorized}
    - {@link oaj.http.response.UnavailableForLegalReasons}
    - {@link oaj.http.response.UnprocessableEntity}
    - {@link oaj.http.response.UnsupportedMediaType}
    - {@link oaj.http.response.UpgradeRequired}
    - {@link oaj.http.response.UriTooLong}
    - {@link oaj.http.response.UseProxy}
    - {@link oaj.http.response.VariantAlsoNegotiates}
  - Other:
    - {@link oajr.beans.ChildResourceDescriptions}
    - {@link oajr.beans.ResourceDescriptions}
    - {@link oajr.beans.SeeOtherRoot}
    - {@link java.lang.Throwable}
- Annotated parameters (either on the parameter or parameter type):
  - {@link oaj.http.annotation.Response}

REST Java methods can also generate a response via the following:

- By calling {@link oajr.RestResponse#setContent(Object)} with any of the types above.
- By accessing the {@link java.io.Writer} directly by calling {@link oajr.RestResponse#getNegotiatedWriter()} and writing the output yourself.

##### Example:

| // Equivalent method 1 | @RestGet("/example1/{personId}") | public Person doGet1(@Path("personId") UUID personId) { | Person person = getPersonById(personId); | return person; | } | | // Equivalent method 2 | @RestGet("/example2/{personId}") | public void doGet2(RestResponse res, @Path("personId") UUID personId) { | Person person = getPersonById(personId); | res.setContent(person); | }

Additional parameter types can be defined via the annotation {@link oajr.annotation.Rest#responseProcessors()} or by calling {@link oajr.RestContext.Builder#responseProcessors(Class...)}.

##### Example:

| @Rest( | responseProcessors={ MyResponseProcessor.class } // Option #1 - Via annotation | ) | public class MyResource extends BasicRestObject { | | // Option #2 - Programmatically | @RestInit | public void init(RestContext.Builder builder) { | builder.responseProcessors(MyResponseProcessor.class); | } | }