org.springframework.http.codec.multipart.FormFieldPart#org.springframework.web.server.ResponseStatusException源码实例Demo

下面列出了org.springframework.http.codec.multipart.FormFieldPart#org.springframework.web.server.ResponseStatusException 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

源代码1 项目: kafka-graphs   文件: GraphAlgorithmHandler.java
public Mono<ServerResponse> run(ServerRequest request) {
    List<String> appIdHeaders = request.headers().header(X_KGRAPH_APPID);
    String appId = request.pathVariable("id");
    return request.bodyToMono(GraphAlgorithmRunRequest.class)
        .flatMapMany(input -> {
            log.debug("num iterations: {}", input.getNumIterations());
            PregelGraphAlgorithm<?, ?, ?, ?> algorithm = algorithms.get(appId);
            GraphAlgorithmState state = algorithm.run(input.getNumIterations());
            GraphAlgorithmStatus status = new GraphAlgorithmStatus(state);
            Flux<GraphAlgorithmStatus> states =
                proxyRun(appIdHeaders.isEmpty() ? group.getCurrentMembers().keySet() : Collections.emptySet(), appId, input);
            return Mono.just(status).mergeWith(states);
        })
        .onErrorMap(RuntimeException.class, e -> new ResponseStatusException(NOT_FOUND))
        .reduce((state1, state2) -> state1)
        .flatMap(state ->
            ServerResponse.ok()
                .contentType(MediaType.APPLICATION_JSON)
                .body(Mono.just(state), GraphAlgorithmStatus.class)
        );

}
 
源代码2 项目: openvsx   文件: UserAPI.java
@PostMapping(
    path = "/user/token/delete/{id}",
    produces = MediaType.APPLICATION_JSON_VALUE
)
@Transactional(rollbackOn = ResponseStatusException.class)
public ResultJson deleteAccessToken(@PathVariable long id) {
    var principal = users.getOAuth2Principal();
    if (principal == null) {
        throw new ResponseStatusException(HttpStatus.FORBIDDEN);
    }
    var user = users.updateUser(principal);
    var token = repositories.findAccessToken(id);
    if (token == null || !token.isActive() || !token.getUser().equals(user)) {
        return ResultJson.error("Token does not exist.");
    }
    token.setActive(false);
    return ResultJson.success("Deleted access token for user " + user.getLoginName());
}
 
@Test
public void verify_ResponseStatusException_with_TypeMismatchException_is_handled_generically_when_status_code_is_unexpected() {
    ExtractableResponse response =
        given()
            .baseUri("http://localhost")
            .port(SERVER_PORT)
            .log().all()
            .when()
            .get(TYPE_MISMATCH_WITH_UNEXPECTED_STATUS_ENDPOINT)
            .then()
            .log().all()
            .extract();

    // In this case the endpoint should throw a ResponseStatusException with a TypeMismatchException cause,
    //      but with an unexpected status code (403). Rather than treat it as a TypeMismatchException, we should
    //      get back a response that matches the desired status code.
    verifyErrorReceived(response, SampleCoreApiError.FORBIDDEN);
    ResponseStatusException ex = verifyResponseStatusExceptionSeenByBackstopper(
        ResponseStatusException.class, 403
    );
    TypeMismatchException tme = verifyExceptionHasCauseOfType(ex, TypeMismatchException.class);
    verifyHandlingResult(
        SampleCoreApiError.FORBIDDEN,
        Pair.of("exception_message", quotesToApostrophes(ex.getMessage()))
    );
}
 
源代码4 项目: openvsx   文件: UserAPI.java
@PostMapping(
    path = "/user/namespace/{namespace}/role",
    produces = MediaType.APPLICATION_JSON_VALUE
)
@Transactional(rollbackOn = ResponseStatusException.class)
public ResultJson setNamespaceMember(@PathVariable String namespace, @RequestParam String user,
        @RequestParam String role, @RequestParam(required = false) String provider) {
    var principal = users.getOAuth2Principal();
    if (principal == null) {
        throw new ResponseStatusException(HttpStatus.FORBIDDEN);
    }
    try {
        var requestingUser = users.updateUser(principal);
        return users.setNamespaceMember(requestingUser, namespace, provider, user, role);
    } catch (ErrorResultException exc) {
        return ResultJson.error(exc.getMessage());
    }
}
 
@ExceptionHandler(value = {Throwable.class})
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Result handle(Throwable throwable) {
    Result result = Result.fail();
    if (throwable instanceof ResponseStatusException) {
        result = handle((ResponseStatusException) throwable);
    } else if (throwable instanceof ConnectTimeoutException) {
        result = handle((ConnectTimeoutException) throwable);
    } else if (throwable instanceof NotFoundException) {
        result = handle((NotFoundException) throwable);
    } else if (throwable instanceof RuntimeException) {
        result = handle((RuntimeException) throwable);
    } else if (throwable instanceof Exception) {
        result = handle((Exception) throwable);
    }
    return result;
}
 
源代码6 项目: java-trader   文件: ConfigController.java
@RequestMapping(path=URL_PREFIX+"/{configSource}/**",
        method=RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String getConfigItem(@PathVariable(value="configSource") String configSourceStr, HttpServletRequest request){
    String requestURI = request.getRequestURI();
    String configItem = requestURI.substring( URL_PREFIX.length()+configSourceStr.length()+1);
    Object obj = null;
    if ( "ALL".equalsIgnoreCase(configSourceStr) ) {
        obj = ConfigUtil.getObject(configItem);
    }else{
        String configSource = configSources.get(configSourceStr.toLowerCase());
        if (configSource==null){
            throw new ResponseStatusException(HttpStatus.NOT_FOUND);
        }
        obj = ConfigUtil.getObject(configSource, configItem);
    }
    if( logger.isDebugEnabled() ){
        logger.debug("Get config "+configSourceStr+" path \""+configItem+"\" value: \""+obj+"\"");
    }
    if ( obj==null ){
        throw new ResponseStatusException(HttpStatus.NOT_FOUND);
    }else{
        return obj.toString();
    }
}
 
源代码7 项目: syndesis   文件: TeiidOpenShiftClient.java
public void createDataSource(DefaultSyndesisDataSource scd) throws AdminException {
    String syndesisName = scd.getSyndesisName();
    debug(syndesisName, "Creating the Datasource of Type " + scd.getType());

    if (scd.getTeiidName() == null) {
        for (int i = 0; i < 3; i++) {
            try {
                String name = getUniqueTeiidName(scd, syndesisName);
                scd.setTeiidName(name);
                break;
            } catch (PersistenceException | DataIntegrityViolationException ignored) {
                //multiple pods are trying to assign a name simultaneously
                //if we try again, then we'll just pickup whatever someone else set
            }
        }
        if (scd.getTeiidName() == null) {
            throw new ResponseStatusException(HttpStatus.CONFLICT);
        }
    }

    //now that the name is set, we can create the properties
    this.metadata.registerDataSource(scd);
}
 
@Test
public void verify_GENERIC_SERVICE_ERROR_returned_if_ResponseStatusException_with_ConversionNotSupportedException_cause_is_thrown() {
    ExtractableResponse response =
        given()
            .baseUri("http://localhost")
            .port(SERVER_PORT)
            .log().all()
            .when()
            .get(CONVERSION_NOT_SUPPORTED_EXCEPTION_ENDPOINT_PATH)
            .then()
            .log().all()
            .extract();

    verifyErrorReceived(response, SampleCoreApiError.GENERIC_SERVICE_ERROR);
    ResponseStatusException ex = verifyExceptionSeenByBackstopper(ResponseStatusException.class);
    ConversionNotSupportedException cnse = verifyExceptionHasCauseOfType(ex, ConversionNotSupportedException.class);
    verifyHandlingResult(
        SampleCoreApiError.GENERIC_SERVICE_ERROR,
        Pair.of("exception_message", quotesToApostrophes(ex.getMessage())),
        Pair.of("bad_property_name", cnse.getPropertyName()),
        Pair.of("bad_property_value", cnse.getValue().toString()),
        Pair.of("required_type", cnse.getRequiredType().toString())
    );
}
 
源代码9 项目: java-trader   文件: TAController.java
@RequestMapping(path=URL_PREFIX+"/{instrument}/{level:.+}",
method=RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public String getLevelBars(@PathVariable(value="instrument") String instrumentStr, @PathVariable(value="level") String level, @RequestParam(name="pretty", required=false) boolean pretty){
    Exchangeable instrument = Exchangeable.fromString(instrumentStr);
    TechnicalAnalysisAccess access = technicalAnalysisService.forInstrument(instrument);
    if ( access==null ) {
        throw new ResponseStatusException(HttpStatus.NOT_FOUND);
    }
    JsonElement json = null;
    PriceLevel l = PriceLevel.valueOf(level);
    BarSeries series = access.getSeries(l);
    if ( series==null ) {
        throw new ResponseStatusException(HttpStatus.NOT_FOUND);
    }
    json = JsonUtil.object2json(series);
    return (JsonUtil.json2str(json, pretty));
}
 
private void resourceNotFound(HttpMethod httpMethod) {
	MockServerHttpRequest request = MockServerHttpRequest.method(httpMethod, "").build();
	MockServerWebExchange exchange = MockServerWebExchange.from(request);
	setPathWithinHandlerMapping(exchange, "not-there.css");
	Mono<Void> mono = this.handler.handle(exchange);

	StepVerifier.create(mono)
			.expectErrorSatisfies(err -> {
				assertThat(err, instanceOf(ResponseStatusException.class));
				assertEquals(HttpStatus.NOT_FOUND, ((ResponseStatusException) err).getStatus());
			}).verify(TIMEOUT);

	// SPR-17475
	AtomicReference<Throwable> exceptionRef = new AtomicReference<>();
	StepVerifier.create(mono).consumeErrorWith(exceptionRef::set).verify();
	StepVerifier.create(mono).consumeErrorWith(ex -> assertNotSame(exceptionRef.get(), ex)).verify();
}
 
@Override
@Nullable
protected ModelAndView doResolveException(
		HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) {

	try {
		if (ex instanceof ResponseStatusException) {
			return resolveResponseStatusException((ResponseStatusException) ex, request, response, handler);
		}

		ResponseStatus status = AnnotatedElementUtils.findMergedAnnotation(ex.getClass(), ResponseStatus.class);
		if (status != null) {
			return resolveResponseStatus(status, request, response, handler, ex);
		}

		if (ex.getCause() instanceof Exception) {
			return doResolveException(request, response, handler, (Exception) ex.getCause());
		}
	}
	catch (Exception resolveEx) {
		if (logger.isWarnEnabled()) {
			logger.warn("Failure while trying to resolve exception [" + ex.getClass().getName() + "]", resolveEx);
		}
	}
	return null;
}
 
源代码12 项目: openvsx   文件: UpstreamRegistryService.java
private byte[] getFile(String url) {
    var headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM));
    var response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<String>(headers), byte[].class);
    switch (response.getStatusCode()) {
        case OK:
            return response.getBody();
        case NOT_FOUND:
            throw new NotFoundException();
        default:
            throw new ResponseStatusException(response.getStatusCode(),
                    "Upstream registry responded with status \"" + response.getStatusCode().getReasonPhrase() + "\".");
    }
}
 
源代码13 项目: openvsx   文件: VSCodeAdapter.java
@GetMapping("/vscode/item")
public ModelAndView getItemUrl(@RequestParam String itemName, ModelMap model) {
    var dotIndex = itemName.indexOf('.');
    if (dotIndex < 0) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Expecting an item of the form `{publisher}.{name}`");
    }
    var namespace = itemName.substring(0, dotIndex);
    var extension = itemName.substring(dotIndex + 1);
    return new ModelAndView("redirect:" + UrlUtil.createApiUrl(webuiUrl, "extension", namespace, extension), model);
}
 
源代码14 项目: openvsx   文件: AdminAPI.java
@GetMapping(
    path = "/admin/log",
    produces = MediaType.TEXT_PLAIN_VALUE
)
public String getLog(@RequestParam("token") String tokenValue,
                     @RequestParam(name = "period", required = false) String periodString) {
    var token = users.useAccessToken(tokenValue);
    if (token == null) {
        throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Invalid access token.");
    }
    if (!UserData.ROLE_ADMIN.equals(token.getUser().getRole())) {
        throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Administration role is required.");
    }

    Streamable<PersistedLog> logs;
    if (Strings.isNullOrEmpty(periodString)) {
        logs = repositories.findAllPersistedLogs();
    } else {
        try {
            var period = Period.parse(periodString);
            var now = TimeUtil.getCurrentUTC();
            logs = repositories.findPersistedLogsAfter(now.minus(period));
        } catch (DateTimeParseException exc) {
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid period");
        }
    }
    return logs.stream()
            .map(this::toString)
            .collect(Collectors.joining("\n")) + "\n";
}
 
源代码15 项目: openvsx   文件: LocalRegistryService.java
@Transactional(rollbackOn = ResponseStatusException.class)
public ResultJson postReview(ReviewJson review, String namespace, String extensionName) {
    var principal = users.getOAuth2Principal();
    if (principal == null) {
        throw new ResponseStatusException(HttpStatus.FORBIDDEN);
    }
    var extension = repositories.findExtension(extensionName, namespace);
    if (extension == null) {
        return ResultJson.error("Extension not found: " + namespace + "." + extensionName);
    }
    var user = users.updateUser(principal);
    var activeReviews = repositories.findActiveReviews(extension, user);
    if (!activeReviews.isEmpty()) {
        return ResultJson.error("You must not submit more than one review for an extension.");
    }

    var extReview = new ExtensionReview();
    extReview.setExtension(extension);
    extReview.setActive(true);
    extReview.setTimestamp(TimeUtil.getCurrentUTC());
    extReview.setUser(user);
    extReview.setTitle(review.title);
    extReview.setComment(review.comment);
    extReview.setRating(review.rating);
    entityManager.persist(extReview);
    extension.setAverageRating(computeAverageRating(extension));
    search.updateSearchEntry(extension);
    return ResultJson.success("Added review for " + extension.getNamespace().getName() + "." + extension.getName());
}
 
源代码16 项目: tutorials   文件: ActorController.java
@PutMapping("/actor/{id}/{name}")
public String updateActorName(@PathVariable("id") int id, @PathVariable("name") String name) {
    try {
        return actorService.updateActor(id, name);
    } catch (ActorNotFoundException ex) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Provide correct Actor Id", ex);
    }
}
 
源代码17 项目: quarkus   文件: ResponseStatusExceptionMapper.java
@Override
public Response toResponse(ResponseStatusException exception) {
    Response.ResponseBuilder responseBuilder = new ResponseBuilderImpl().status(exception.getStatus().value());
    addHeaders(responseBuilder, exception.getResponseHeaders());
    return responseBuilder.entity(exception.getMessage())
            .type(MediaType.TEXT_PLAIN).build();
}
 
源代码18 项目: gaia   文件: TerraformStateController.java
@GetMapping("/api/state/{id}")
public Map<String, Object> getState(@PathVariable String id){
    return repository.findById(id)
            .orElseThrow(
                    () -> new ResponseStatusException(HttpStatus.NOT_FOUND))
            .getValue();
}
 
@API(status = INTERNAL)
@ExceptionHandler
default Mono<ResponseEntity<Problem>> handleResponseStatusException(
        final ResponseStatusException exception,
        final ServerWebExchange request) {
    return create(exception.getStatus(), exception, request);
}
 
源代码20 项目: kafka-graphs   文件: GraphAlgorithmHandler.java
private String getConfig(Map<String, String> configs, String key, boolean isRequired) {
    String value = configs != null ? configs.get(key) : null;
    if (isRequired && value == null) {
        throw new ResponseStatusException(BAD_REQUEST, "Missing param: " + key);
    }
    return value;
}
 
源代码21 项目: syndesis   文件: MetadataServiceTest.java
@Test
public void testGetSchemaSingleLevel() throws AdminException {
    assertThatThrownBy(() -> metadataService.getSourceSchema("source3"))
        .isInstanceOf(ResponseStatusException.class);

    //add the data source, and schema
    DefaultSyndesisDataSource sds = DataVirtualizationServiceTest.createH2DataSource("source3");
    metadataInstance.registerDataSource(sds);


    repositoryManagerImpl.createSchema("someid", "source3",
            "create foreign table tbl (col string) options (\"teiid_rel:fqn\" 'collection=bar');"
            + "create foreign table tbl1 (col string) options (\"teiid_rel:fqn\" 'collection=bar1');");

    List<RestSchemaNode> nodes = metadataService.getSourceSchema("source3");
    assertEquals(
        "[ {\n" +
        "  \"children\" : [ {\n" +
        "    \"children\" : [ ],\n" +
        "    \"name\" : \"bar\",\n" +
        "    \"teiidName\" : \"tbl\",\n" +
        "    \"connectionName\" : \"source3\",\n" +
        "    \"type\" : \"collection\",\n" +
        "    \"queryable\" : true\n" +
        "  }, {\n" +
        "    \"children\" : [ ],\n" +
        "    \"name\" : \"bar1\",\n" +
        "    \"teiidName\" : \"tbl1\",\n" +
        "    \"connectionName\" : \"source3\",\n" +
        "    \"type\" : \"collection\",\n" +
        "    \"queryable\" : true\n" +
        "  } ],\n" +
        "  \"name\" : \"source3\",\n" +
        "  \"type\" : \"teiidSource\",\n" +
        "  \"queryable\" : false\n" +
        "} ]", JsonMarshaller.marshall(nodes));
}
 
@DataProvider(value = {
    "400    |   INVALID_REQUEST",
    "401    |   UNAUTHORIZED",
    "403    |   FORBIDDEN",
    "404    |   NOT_FOUND",
    "405    |   METHOD_NOT_ALLOWED",
    "406    |   NO_ACCEPTABLE_REPRESENTATION",
    "415    |   UNSUPPORTED_MEDIA_TYPE",
    "429    |   TOO_MANY_REQUESTS",
    "500    |   GENERIC_SERVICE_ERROR",
    "503    |   TEMPORARY_SERVICE_PROBLEM",
}, splitBy = "\\|")
@Test
public void verify_generic_ResponseStatusCode_exceptions_result_in_ApiError_from_project_if_status_code_is_known(
    int desiredStatusCode, SampleCoreApiError expectedError
) {
    ExtractableResponse response =
        given()
            .baseUri("http://localhost")
            .port(SERVER_PORT)
            .log().all()
            .when()
            .header("desired-status-code", desiredStatusCode)
            .get(RESPONSE_STATUS_EX_FOR_SPECIFIC_STATUS_CODE_ENDPOINT)
            .then()
            .log().all()
            .extract();

    verifyErrorReceived(response, expectedError);
    ResponseStatusException ex = verifyResponseStatusExceptionSeenByBackstopper(
        ResponseStatusException.class, desiredStatusCode
    );
    verifyHandlingResult(
        expectedError,
        Pair.of("exception_message", quotesToApostrophes(ex.getMessage()))
    );
}
 
@DataProvider(value = {
    "400    |   GENERIC_BAD_REQUEST",
    "401    |   UNAUTHORIZED",
    "403    |   FORBIDDEN",
    "404    |   NOT_FOUND",
    "405    |   METHOD_NOT_ALLOWED",
    "406    |   NO_ACCEPTABLE_REPRESENTATION",
    "415    |   UNSUPPORTED_MEDIA_TYPE",
    "429    |   TOO_MANY_REQUESTS",
    "500    |   GENERIC_SERVICE_ERROR",
    "503    |   TEMPORARY_SERVICE_PROBLEM",
}, splitBy = "\\|")
@Test
public void handleFluxExceptions_handles_generic_ResponseStatusException_by_returning_ApiError_from_project_if_status_code_is_known(
    int desiredStatusCode, BarebonesCoreApiErrorForTesting expectedError
) {
    // given
    ResponseStatusException ex = new ResponseStatusException(
        HttpStatus.resolve(desiredStatusCode), "Some ResponseStatusException reason"
    );
    List<Pair<String, String>> expectedExtraDetailsForLogging = new ArrayList<>();
    ApiExceptionHandlerUtils.DEFAULT_IMPL.addBaseExceptionMessageToExtraDetailsForLogging(
        ex, expectedExtraDetailsForLogging
    );

    // when
    ApiExceptionHandlerListenerResult result = listener.handleSpringMvcOrWebfluxSpecificFrameworkExceptions(ex);

    // then
    validateResponse(
        result,
        true,
        singleton(expectedError),
        expectedExtraDetailsForLogging
    );
}
 
@GetMapping("/milestones/{name}/duedate")
public SpringCloudInfoService.Milestone milestoneDueDate(@PathVariable String name)
		throws IOException {
	try {
		return versionService.getMilestoneDueDate(name);
	}
	catch (SpringCloudMilestoneNotFoundException e) {
		throw new ResponseStatusException(HttpStatus.NOT_FOUND, e.getMessage());
	}
}
 
private void testInvalidPath(String requestPath, ResourceWebHandler handler) {
	ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
	setPathWithinHandlerMapping(exchange, requestPath);

	StepVerifier.create(handler.handle(exchange))
			.expectErrorSatisfies(err -> {
				assertThat(err, instanceOf(ResponseStatusException.class));
				assertEquals(HttpStatus.NOT_FOUND, ((ResponseStatusException) err).getStatus());
			}).verify(TIMEOUT);
}
 
源代码26 项目: synapse   文件: JournalRestController.java
/**
 * Returns an application/hal+json representation of the event journal of a single event-sourced entity.
 *
 * @param repositoryName the name of the {@link Journal}
 * @param entityId the id of the requested entity
 * @param uriComponentsBuilder builder used to create hrefs
 *
 * @return HalRepresentation the representation of the journal
 */
@GetMapping(
        path = "${edison.application.management.base-path:internal}/journals/{repositoryName}/{entityId}",
        produces = {"application/hal+json", "application/json"}
)
@ResponseBody
public HalRepresentation getEntityJournalJson(final @PathVariable String repositoryName,
                                              final @PathVariable String entityId,
                                              final UriComponentsBuilder uriComponentsBuilder) {
    final String baseUri = uriComponentsBuilder.pathSegment(managementBasePath).toUriString();
    final String selfUri = baseUri + "/journals/" + repositoryName + "/" + entityId;

    if (journals.hasJournal(repositoryName)) {
        final List<MessageStoreEntryRepresentation> messages =
            journals.getJournal(repositoryName)
                    .map(journal -> journal.getJournalFor(entityId)
                            .map(MessageStoreEntryRepresentation::new)
                            .collect(toList()))
                    .orElse(emptyList());
        final Links.Builder links = linkingTo()
                .self(selfUri);
        if (stateRepositories.containsKey(repositoryName)) {
            links
                    .single(
                            link("working-copy", baseUri + "/staterepositories/" + repositoryName + "/" + entityId))
                    .single(
                            collection(baseUri + "/staterepositories/" + repositoryName + "{?page,pageSize}"));
        }
        return new JournalHalRepresentation(
                links.build(),
                messages);
    } else {
        throw new ResponseStatusException(NOT_FOUND, "No such Journal " + repositoryName);
    }
}
 
源代码27 项目: tutorials   文件: FooController.java
@GetMapping(value = "/{id}")
public Foo findById(@PathVariable("id") final Long id, final HttpServletResponse response) {
    try {
        final Foo resourceById = RestPreconditions.checkFound(service.findById(id));

        eventPublisher.publishEvent(new SingleResourceRetrievedEvent(this, response));
        return resourceById;
    }
    catch (MyResourceNotFoundException exc) {
        throw new ResponseStatusException(
            HttpStatus.NOT_FOUND, "Foo Not Found", exc);
    }

}
 
@Test
public void missingResourcePath() {
	MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
	setPathWithinHandlerMapping(exchange, "");
	StepVerifier.create(this.handler.handle(exchange))
			.expectErrorSatisfies(err -> {
				assertThat(err, instanceOf(ResponseStatusException.class));
				assertEquals(HttpStatus.NOT_FOUND, ((ResponseStatusException) err).getStatus());
			}).verify(TIMEOUT);
}
 
@Test
public void toHttpHandlerHandlerResponseStatusException() {
	HandlerFunction<ServerResponse> handlerFunction =
			request -> Mono.error(new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found"));
	RouterFunction<ServerResponse> routerFunction =
			RouterFunctions.route(RequestPredicates.all(), handlerFunction);

	HttpHandler result = RouterFunctions.toHttpHandler(routerFunction);
	assertNotNull(result);

	MockServerHttpRequest httpRequest = MockServerHttpRequest.get("http://localhost").build();
	MockServerHttpResponse httpResponse = new MockServerHttpResponse();
	result.handle(httpRequest, httpResponse).block();
	assertEquals(HttpStatus.NOT_FOUND, httpResponse.getStatusCode());
}
 
@Test
public void toHttpHandlerHandlerReturnResponseStatusExceptionInResponseWriteTo() {
	HandlerFunction<ServerResponse> handlerFunction =
			// Mono.<ServerResponse> is required for compilation in Eclipse
			request -> Mono.just(new ServerResponse() {
				@Override
				public HttpStatus statusCode() {
					return HttpStatus.OK;
				}
				@Override
				public HttpHeaders headers() {
					return new HttpHeaders();
				}
				@Override
				public MultiValueMap<String, ResponseCookie> cookies() {
					return new LinkedMultiValueMap<>();
				}
				@Override
				public Mono<Void> writeTo(ServerWebExchange exchange, Context context) {
					return Mono.error(new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found"));
				}
			});
	RouterFunction<ServerResponse> routerFunction =
			RouterFunctions.route(RequestPredicates.all(), handlerFunction);

	HttpHandler result = RouterFunctions.toHttpHandler(routerFunction);
	assertNotNull(result);

	MockServerHttpRequest httpRequest = MockServerHttpRequest.get("http://localhost").build();
	MockServerHttpResponse httpResponse = new MockServerHttpResponse();
	result.handle(httpRequest, httpResponse).block();
	assertEquals(HttpStatus.NOT_FOUND, httpResponse.getStatusCode());
}