Эта идея основана на реализации WebAppContext , где можно использовать WebAppContext.getUnavailableException () , чтобы определить, успешно ли был инициализирован контекст.
Просто замените реализацию Server и Context по умолчанию на вашу собственную:
public static class MyContext extends Context {
private Exception _exception;
@Override
protected void doStart() throws Exception {
try {
super.doStart();
} catch (final Exception e) {
_exception = e;
}
}
@Override
protected void doStop() throws Exception {
try {
super.doStop();
} finally {
_exception = null;
}
}
public Exception getException() {
return _exception;
}
}
public static class MyServer extends Server implements InitializingBean {
public void afterPropertiesSet() throws Exception {
start();
for (final Handler h : getHandlers()) {
if (h instanceof MyContext) {
final MyContext c = (MyContext) h;
if (c.getException() != null) {
throw new RuntimeException("failed to init context " + c.getDisplayName(),
c.getException());
}
}
}
}
}
В вашем файле beans.xml просто замените org.mortbay.jetty.Server
(и удалите init-method="start"
) и org.mortbay.jetty.servlet.Context
своими собственными реализациями.
Хотя этот код предназначен для Jetty 6 (как пример, на который вы ссылаетесь), так как это то, что у меня есть. Я не проверял это, хотя, но это почти то же самое, что мы успешно используем вместе с WebAppContext. Чтобы распространить это на RequestLogHandler, вы можете сделать то же самое для любого используемого вами обработчика или создать декоратор для переноса любого обработчика. Вы можете посмотреть на org.mortbay.jetty.handler.HandlerWrapper
для этой цели.