0

我发现自己正在工作一个 grails 应用程序,该应用程序被部署为一个胖 jar,由一个自定义插件构建,该插件使用 dropwizard 配置码头。

似乎 dropwizard 不允许使用普通的旧 web.xml 或 jetty.xml,而是在启动时由 java config 设置所有内容(即使用 com.yammer.dropwizard.config.Environment)。

我在这里错过了什么吗?有什么方法可以将 404 映射回 URL 或我可以覆盖的任何类型的网页,这样 Jetty 404 就不是默认设置。

(是的,我知道我可以使用负载均衡器来重定向 404)

4

1 回答 1

0

我不知道它在 grails 中的情况,但这有助于使用 dropwizard 0.7.1 run() 方法的 java:

ResourceConfig jrConfig = environment.jersey().getResourceConfig();
environment.jersey().register(new RestErrorsHandler(jrConfig ));

为异常映射创建此类 -> 回馈个人响应!

@Provider
public class RestErrorsHandler implements ExceptionMapper<Exception> {

/**
 * Deletes all ExpetionMappers.
 * 
 * @param jrConfig
 */
public RestErrorsHandler(
    ResourceConfig jrConfig)
{
    // Remove all of Dropwizard's custom ExceptionMappers
    Set<?> dwSingletons = jrConfig.getSingletons();
    List<Object> singletonsToRemove = new ArrayList<Object>();
    for (Object s : dwSingletons) {
            // Remove all Exception mappers
            if (s instanceof ExceptionMapper) {
                singletonsToRemove.add(s);
            }
    }
    for (Object s : singletonsToRemove) {
        jrConfig.getSingletons().remove(s);
    }
}

public Response toResponse(
    Exception exception)
{   
    //Handle different exceptions in another way
    if (exception.getClass().equals(JsonParseException.class)){
        Response response = RestErrorsHandler.generalResponse(exception);
        return response ;
    } else if(exception.getClass().equals(JsonParseException.class)){
        Response response = RestErrorsHandler.generalResponse(exception);
        return response ;
    } else if(exception.getClass().equals(Class.class)){
        Response response = RestErrorsHandler.generalResponse(exception);
        return response ;
    }

    //genral problem -> output default
    Response response = RestErrorsHandler.generalResponse(exception);
    return response ;

}

public static Response generalResponse(Exception exception)
{
    return Response.status(Status.BAD_REQUEST).type(MediaType.TEXT_PLAIN)
        .entity("if you just want to give back a string, but could also be default html page or whatever").build();
}



}
于 2014-10-02T13:02:28.003 回答