Skip to content

Commit

Permalink
Allow APIResponse on ExceptionMapper class
Browse files Browse the repository at this point in the history
Allow the APIResponse annotation to be used on an exception mapper class
as well as the toResponse method.
  • Loading branch information
Azquelt committed Apr 19, 2022
1 parent c4b011e commit fc5ddf5
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 4 deletions.
Expand Up @@ -51,9 +51,9 @@
* specified responseCode the response is not added to that operation.
*
* <p>
* When this annotation is applied to an <code>ExceptionMapper</code>, it allows developers to describe the API response
* that will be added to a generated OpenAPI operation based on a JAX-RS method that declares an <code>Exception</code>
* of the type handled by the <code>ExceptionMapper</code>.
* When this annotation is applied to an <code>ExceptionMapper</code> class or <code>toResponse</code> method, it allows
* developers to describe the API response that will be added to a generated OpenAPI operation based on a JAX-RS method
* that declares an <code>Exception</code> of the type handled by the <code>ExceptionMapper</code>.
*
* <pre>
* &#64;Provider
Expand Down
@@ -0,0 +1,26 @@
/**
* Copyright (c) 2022 Contributors to the Eclipse Foundation
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
* under the License.
*/
package org.eclipse.microprofile.openapi.apps.airlines.exception;

@SuppressWarnings("serial")
public class ReviewRejectedException extends Exception {

public ReviewRejectedException(String rejectionReason, Throwable cause) {
super(rejectionReason, cause);
}

public ReviewRejectedException(String rejectionReason) {
super(rejectionReason);
}

}
@@ -0,0 +1,48 @@
/**
* Copyright (c) 2022 Contributors to the Eclipse Foundation
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
* under the License.
*/
package org.eclipse.microprofile.openapi.apps.airlines.exception;

import org.eclipse.microprofile.openapi.annotations.media.Content;
import org.eclipse.microprofile.openapi.annotations.media.Schema;
import org.eclipse.microprofile.openapi.annotations.responses.APIResponse;
import org.eclipse.microprofile.openapi.apps.airlines.exception.ReviewRejectedExceptionMapper.RejectionResponse;

import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;
import jakarta.ws.rs.ext.ExceptionMapper;

@APIResponse(responseCode = "400", description = "The review was rejected", content = @Content(mediaType = MediaType.APPLICATION_JSON, schema = @Schema(implementation = RejectionResponse.class)))
public class ReviewRejectedExceptionMapper implements ExceptionMapper<ReviewRejectedException> {

@Override
public Response toResponse(ReviewRejectedException exception) {
RejectionResponse response = new RejectionResponse();
response.setReason(exception.getMessage());
return Response.status(Status.BAD_REQUEST).entity(response).build();
}

public static class RejectionResponse {
@Schema(description = "The reason the review was rejected")
private String reason;

public String getReason() {
return reason;
}

public void setReason(String reason) {
this.reason = reason;
}
}

}
Expand Up @@ -46,6 +46,7 @@
import org.eclipse.microprofile.openapi.annotations.servers.Servers;
import org.eclipse.microprofile.openapi.annotations.tags.Tag;
import org.eclipse.microprofile.openapi.annotations.tags.Tags;
import org.eclipse.microprofile.openapi.apps.airlines.exception.ReviewRejectedException;
import org.eclipse.microprofile.openapi.apps.airlines.model.Airline;
import org.eclipse.microprofile.openapi.apps.airlines.model.Review;
import org.eclipse.microprofile.openapi.apps.airlines.model.User;
Expand Down Expand Up @@ -233,7 +234,7 @@ public Response getReviewByAirlineAndUser(
@Operation(summary = "Create a Review", operationId = "createReview")
@Consumes("application/json")
@Produces("application/json")
public Response createReview(Review review) {
public Response createReview(Review review) throws ReviewRejectedException {
reviews.put(currentId, review);
return Response.status(Status.CREATED).entity("{\"id\":" + currentId++ + "}").build();
}
Expand Down
Expand Up @@ -1029,6 +1029,14 @@ public void testExceptionMappers(String type) {
vr.body("paths.'/user/{username}'.get.responses.'404'.description", equalTo("Not Found"));

vr.body("paths.'/user/{id}'.get.responses.'404'.content.'application/json'.schema", notNullValue());

vr.body("paths.'/reviews'.post.responses.'400'.description", equalTo("The review was rejected"));
vr.body("paths.'/reviews'.post.responses.'400'.content.'application/json'.schema", notNullValue());

String rejectedReviewSchema =
dereference(vr, "paths.'/reviews'.post.responses.'400'.content.'application/json'.schema");
vr.body(rejectedReviewSchema + ".type", equalTo("object"));
vr.body(rejectedReviewSchema + ".properties", hasKey("reason"));
}

}

0 comments on commit fc5ddf5

Please sign in to comment.