Browse Source

Merge pull request #312 in CORE/base-third from ~ZHOUPING/base-third:feature/10.0 to feature/10.0

* commit '2ca0a350b65d3385c4cb19faa613506a1d70a634':
  KERNEL-1329 & KERNEL-1334 & KERNEL-1310 fine-quartz、fine-spring、fine-ehcache支持JDK11
research/11.0
zhouping 5 years ago
parent
commit
4443551815
  1. 2
      fine-ehcache/src/com/fr/third/net/sf/ehcache/statistics/extended/ExtendedStatisticsImpl.java
  2. 110
      fine-quartz/src/com/fr/third/v2/org/quartz/jobs/ee/ejb/EJB3InvokerJob.java
  3. 277
      fine-quartz/src/com/fr/third/v2/org/quartz/jobs/ee/ejb/EJBInvokerJob.java
  4. 2
      fine-quartz/src/com/fr/third/v2/org/quartz/xml/XMLSchedulingDataProcessor.java
  5. 23
      fine-spring/src/com/fr/third/springframework/ejb/access/AbstractRemoteSlsbInvokerInterceptor.java
  6. 68
      fine-spring/src/com/fr/third/springframework/remoting/rmi/JndiRmiClientInterceptor.java
  7. 5
      fine-spring/src/com/fr/third/springframework/remoting/rmi/JndiRmiServiceExporter.java
  8. 9
      fine-spring/src/com/fr/third/springframework/remoting/rmi/RmiClientInterceptorUtils.java
  9. 1
      fine-spring/src/com/fr/third/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java

2
fine-ehcache/src/com/fr/third/net/sf/ehcache/statistics/extended/ExtendedStatisticsImpl.java vendored

@ -772,7 +772,7 @@ public class ExtendedStatisticsImpl implements ExtendedStatistics {
* @return the operation statistic
*/
private static OperationStatistic findOperationStatistic(StatisticsManager manager, StandardOperationStatistic statistic) {
Set<OperationStatistic<? extends Enum>> results = findOperationStatistic(manager,
Set<OperationStatistic<? extends Enum>> results = (Set<OperationStatistic<? extends Enum>>)findOperationStatistic(manager,
statistic.context(),
statistic.type(),
statistic.operationName(),

110
fine-quartz/src/com/fr/third/v2/org/quartz/jobs/ee/ejb/EJB3InvokerJob.java

@ -1,110 +0,0 @@
package com.fr.third.v2.org.quartz.jobs.ee.ejb;
import java.lang.reflect.InvocationTargetException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.fr.third.v2.org.quartz.JobDataMap;
import com.fr.third.v2.org.quartz.JobExecutionContext;
import com.fr.third.v2.org.quartz.JobExecutionException;
/**
* <p>
* A <code>Job</code> that invokes a method on an EJB3.
* </p>
*
* <p>
* Expects the properties corresponding to the following keys to be in the
* <code>JobDataMap</code> when it executes:
* <ul>
* <li><code>EJB_JNDI_NAME_KEY</code>- the JNDI name (location) of the EJB's
* home interface.</li>
* <li><code>EJB_METHOD_KEY</code>- the name of the method to invoke on the EJB.
* </li>
* <li><code>EJB_ARGS_KEY</code>- an Object[] of the args to pass to the method
* (optional, if left out, there are no arguments).</li>
* <li><code>EJB_ARG_TYPES_KEY</code>- an Class[] of the types of the args to
* pass to the method (optional, if left out, the types will be derived by
* calling getClass() on each of the arguments).</li>
* </ul>
* <br/>
* The following keys can also be used at need:
* <ul>
* <li><code>INITIAL_CONTEXT_FACTORY</code> - the context factory used to build
* the context.</li>
* <li><code>PROVIDER_URL</code> - the name of the environment property for
* specifying configuration information for the service provider to use.</li>
* </ul>
* </p>
*
* <p>
* The result of the EJB method invocation will be available to
* <code>Job/TriggerListener</code>s via
* <code>{@link com.fr.third.v2.org.quartz.JobExecutionContext#getResult()}</code>.
* </p>
*
* @author hhuynh
* @see {@link EJBInvokerJob}
*/
public class EJB3InvokerJob extends EJBInvokerJob {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
JobDataMap dataMap = context.getMergedJobDataMap();
String ejb = dataMap.getString(EJB_JNDI_NAME_KEY);
String method = dataMap.getString(EJB_METHOD_KEY);
Object[] arguments = (Object[]) dataMap.get(EJB_ARGS_KEY);
if (arguments == null) {
arguments = new Object[0];
}
if (ejb == null) {
throw new JobExecutionException("must specify EJB_JNDI_NAME_KEY");
}
if (method == null) {
throw new JobExecutionException("must specify EJB_METHOD_KEY");
}
InitialContext jndiContext = null;
Object value = null;
try {
try {
jndiContext = getInitialContext(dataMap);
value = jndiContext.lookup(ejb);
} catch (NamingException ne) {
throw new JobExecutionException(ne);
}
Class<?>[] argTypes = (Class[]) dataMap.get(EJB_ARG_TYPES_KEY);
if (argTypes == null) {
argTypes = new Class[arguments.length];
for (int i = 0; i < arguments.length; i++) {
argTypes[i] = arguments[i].getClass();
}
}
try {
Object returnValue = value.getClass()
.getMethod(method, argTypes).invoke(value, arguments);
context.setResult(returnValue);
} catch (IllegalAccessException iae) {
throw new JobExecutionException(iae);
} catch (InvocationTargetException ite) {
throw new JobExecutionException(ite.getTargetException());
} catch (NoSuchMethodException nsme) {
throw new JobExecutionException(nsme);
}
} finally {
if (jndiContext != null) {
try {
jndiContext.close();
} catch (Exception e) {
// ignored
}
}
}
}
}

277
fine-quartz/src/com/fr/third/v2/org/quartz/jobs/ee/ejb/EJBInvokerJob.java

@ -1,277 +0,0 @@
/*
* All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved.
*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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 com.fr.third.v2.org.quartz.jobs.ee.ejb;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.rmi.RemoteException;
import java.util.Hashtable;
import javax.ejb.EJBHome;
import javax.ejb.EJBMetaData;
import javax.ejb.EJBObject;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import com.fr.third.v2.org.quartz.Job;
import com.fr.third.v2.org.quartz.JobDataMap;
import com.fr.third.v2.org.quartz.JobExecutionContext;
import com.fr.third.v2.org.quartz.JobExecutionException;
/**
* <p>
* A <code>Job</code> that invokes a method on an EJB.
* </p>
*
* <p>
* Expects the properties corresponding to the following keys to be in the
* <code>JobDataMap</code> when it executes:
* <ul>
* <li><code>EJB_JNDI_NAME_KEY</code>- the JNDI name (location) of the
* EJB's home interface.</li>
* <li><code>EJB_METHOD_KEY</code>- the name of the method to invoke on the
* EJB.</li>
* <li><code>EJB_ARGS_KEY</code>- an Object[] of the args to pass to the
* method (optional, if left out, there are no arguments).</li>
* <li><code>EJB_ARG_TYPES_KEY</code>- an Class[] of the types of the args to
* pass to the method (optional, if left out, the types will be derived by
* calling getClass() on each of the arguments).</li>
* </ul>
* <br/>
* The following keys can also be used at need:
* <ul>
* <li><code>INITIAL_CONTEXT_FACTORY</code> - the context factory used to
* build the context.</li>
* <li><code>PROVIDER_URL</code> - the name of the environment property
* for specifying configuration information for the service provider to use.
* </li>
* </ul>
* </p>
*
* <p>
* The result of the EJB method invocation will be available to
* <code>Job/TriggerListener</code>s via
* <code>{@link com.fr.third.v2.org.quartz.JobExecutionContext#getResult()}</code>.
* </p>
*
* @author Andrew Collins
* @author James House
* @author Joel Shellman
* @author <a href="mailto:bonhamcm@thirdeyeconsulting.com">Chris Bonham</a>
*/
public class EJBInvokerJob implements Job {
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* Constants.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
public static final String EJB_JNDI_NAME_KEY = "ejb";
public static final String EJB_METHOD_KEY = "method";
public static final String EJB_ARG_TYPES_KEY = "argTypes";
public static final String EJB_ARGS_KEY = "args";
public static final String INITIAL_CONTEXT_FACTORY = "java.naming.factory.initial";
public static final String PROVIDER_URL = "java.naming.provider.url";
public static final String PRINCIPAL = "java.naming.security.principal";
public static final String CREDENTIALS = "java.naming.security.credentials";
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* Constructors.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
public EJBInvokerJob() {
// nothing
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* Interface.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
public void execute(JobExecutionContext context)
throws JobExecutionException {
JobDataMap dataMap = context.getMergedJobDataMap();
String ejb = dataMap.getString(EJB_JNDI_NAME_KEY);
String method = dataMap.getString(EJB_METHOD_KEY);
Object[] arguments = (Object[]) dataMap.get(EJB_ARGS_KEY);
if (arguments == null) {
arguments = new Object[0];
}
if (ejb == null) {
// must specify remote home
throw new JobExecutionException();
}
InitialContext jndiContext = null;
// get initial context
try {
jndiContext = getInitialContext(dataMap);
} catch (NamingException ne) {
throw new JobExecutionException(ne);
}
try {
Object value = null;
// locate home interface
try {
value = jndiContext.lookup(ejb);
} catch (NamingException ne) {
throw new JobExecutionException(ne);
}
// get home interface
EJBHome ejbHome = (EJBHome) PortableRemoteObject.narrow(value,
EJBHome.class);
// get meta data
EJBMetaData metaData = null;
try {
metaData = ejbHome.getEJBMetaData();
} catch (RemoteException re) {
throw new JobExecutionException(re);
}
// get home interface class
Class<?> homeClass = metaData.getHomeInterfaceClass();
// get remote interface class
Class<?> remoteClass = metaData.getRemoteInterfaceClass();
// get home interface
ejbHome = (EJBHome) PortableRemoteObject.narrow(ejbHome, homeClass);
Method methodCreate = null;
try {
// create method 'create()' on home interface
methodCreate = homeClass.getMethod("create", ((Class[])null));
} catch (NoSuchMethodException nsme) {
throw new JobExecutionException(nsme);
}
// create remote object
EJBObject remoteObj = null;
try {
// invoke 'create()' method on home interface
remoteObj = (EJBObject) methodCreate.invoke(ejbHome, ((Object[])null));
} catch (IllegalAccessException iae) {
throw new JobExecutionException(iae);
} catch (InvocationTargetException ite) {
throw new JobExecutionException(ite);
}
// execute user-specified method on remote object
Method methodExecute = null;
try {
// create method signature
Class<?>[] argTypes = (Class[]) dataMap.get(EJB_ARG_TYPES_KEY);
if (argTypes == null) {
argTypes = new Class[arguments.length];
for (int i = 0; i < arguments.length; i++) {
argTypes[i] = arguments[i].getClass();
}
}
// get method on remote object
methodExecute = remoteClass.getMethod(method, argTypes);
} catch (NoSuchMethodException nsme) {
throw new JobExecutionException(nsme);
}
try {
// invoke user-specified method on remote object
Object returnObj = methodExecute.invoke(remoteObj, arguments);
// Return any result in the JobExecutionContext so it will be
// available to Job/TriggerListeners
context.setResult(returnObj);
} catch (IllegalAccessException iae) {
throw new JobExecutionException(iae);
} catch (InvocationTargetException ite) {
throw new JobExecutionException(ite);
}
} finally {
// Don't close jndiContext until after method execution because
// WebLogic requires context to be open to keep the user credentials
// available. See JIRA Issue: QUARTZ-401
if (jndiContext != null) {
try {
jndiContext.close();
} catch (NamingException e) {
// Ignore any errors closing the initial context
}
}
}
}
protected InitialContext getInitialContext(JobDataMap jobDataMap)
throws NamingException {
Hashtable<String, String> params = new Hashtable<String, String>(2);
String initialContextFactory =
jobDataMap.getString(INITIAL_CONTEXT_FACTORY);
if (initialContextFactory != null) {
params.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);
}
String providerUrl = jobDataMap.getString(PROVIDER_URL);
if (providerUrl != null) {
params.put(Context.PROVIDER_URL, providerUrl);
}
String principal = jobDataMap.getString(PRINCIPAL);
if ( principal != null ) {
params.put( Context.SECURITY_PRINCIPAL, principal );
}
String credentials = jobDataMap.getString(CREDENTIALS);
if ( credentials != null ) {
params.put( Context.SECURITY_CREDENTIALS, credentials );
}
return (params.size() == 0) ? new InitialContext() : new InitialContext(params);
}
}

2
fine-quartz/src/com/fr/third/v2/org/quartz/xml/XMLSchedulingDataProcessor.java

@ -203,7 +203,7 @@ public class XMLSchedulingDataProcessor implements ErrorHandler {
return XMLConstants.NULL_NS_URI;
}
public Iterator<?> getPrefixes(String namespaceURI)
public Iterator<String> getPrefixes(String namespaceURI)
{
// This method isn't necessary for XPath processing.
throw new UnsupportedOperationException();

23
fine-spring/src/com/fr/third/springframework/ejb/access/AbstractRemoteSlsbInvokerInterceptor.java

@ -23,7 +23,6 @@ import java.rmi.RemoteException;
import javax.ejb.EJBHome;
import javax.ejb.EJBObject;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import org.aopalliance.intercept.MethodInvocation;
@ -88,28 +87,6 @@ public abstract class AbstractRemoteSlsbInvokerInterceptor extends AbstractSlsbI
return this.refreshHomeOnConnectFailure;
}
/**
* This overridden lookup implementation performs a narrow operation
* after the JNDI lookup, provided that a home interface is specified.
* @see #setHomeInterface
* @see javax.rmi.PortableRemoteObject#narrow
*/
@Override
protected Object lookup() throws NamingException {
Object homeObject = super.lookup();
if (this.homeInterface != null) {
try {
homeObject = PortableRemoteObject.narrow(homeObject, this.homeInterface);
}
catch (ClassCastException ex) {
throw new RemoteLookupFailureException(
"Could not narrow EJB home stub to home interface [" + this.homeInterface.getName() + "]", ex);
}
}
return homeObject;
}
/**
* Check for EJB3-style home object that serves as EJB component directly.
*/

68
fine-spring/src/com/fr/third/springframework/remoting/rmi/JndiRmiClientInterceptor.java

@ -21,12 +21,9 @@ import java.lang.reflect.Method;
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.omg.CORBA.OBJECT_NOT_EXIST;
import org.omg.CORBA.SystemException;
import com.fr.third.springframework.aop.support.AopUtils;
import com.fr.third.springframework.beans.factory.InitializingBean;
@ -41,8 +38,8 @@ import com.fr.third.springframework.remoting.support.RemoteInvocationFactory;
import com.fr.third.springframework.util.ReflectionUtils;
/**
* {@link org.aopalliance.intercept.MethodInterceptor} for accessing RMI services from JNDI.
* Typically used for RMI-IIOP (CORBA), but can also be used for EJB home objects
* {@link org.aopalliance.intercept.MethodInterceptor} for accessing RMI services
* from JNDI.Typically used for RMI-IIOP, but can also be used for EJB home objects
* (for example, a Stateful Session Bean home). In contrast to a plain JNDI lookup,
* this accessor also performs narrowing through PortableRemoteObject.
*
@ -74,7 +71,6 @@ import com.fr.third.springframework.util.ReflectionUtils;
* @see com.fr.third.springframework.remoting.RemoteAccessException
* @see java.rmi.RemoteException
* @see java.rmi.Remote
* @see javax.rmi.PortableRemoteObject#narrow
*/
public class JndiRmiClientInterceptor extends JndiObjectLocator implements MethodInterceptor, InitializingBean {
@ -227,17 +223,7 @@ public class JndiRmiClientInterceptor extends JndiObjectLocator implements Metho
*/
protected Object lookupStub() throws RemoteLookupFailureException {
try {
Object stub = lookup();
if (getServiceInterface() != null && !(stub instanceof RmiInvocationHandler)) {
try {
stub = PortableRemoteObject.narrow(stub, getServiceInterface());
}
catch (ClassCastException ex) {
throw new RemoteLookupFailureException(
"Could not narrow RMI stub to service interface [" + getServiceInterface().getName() + "]", ex);
}
}
return stub;
return lookup();
}
catch (NamingException ex) {
throw new RemoteLookupFailureException("JNDI lookup for RMI service [" + getJndiName() + "] failed", ex);
@ -306,14 +292,6 @@ public class JndiRmiClientInterceptor extends JndiObjectLocator implements Metho
throw ex;
}
}
catch (SystemException ex) {
if (isConnectFailure(ex)) {
return handleRemoteConnectFailure(invocation, ex);
}
else {
throw ex;
}
}
finally {
getJndiTemplate().releaseContext(ctx);
}
@ -330,17 +308,6 @@ public class JndiRmiClientInterceptor extends JndiObjectLocator implements Metho
return RmiClientInterceptorUtils.isConnectFailure(ex);
}
/**
* Determine whether the given CORBA exception indicates a connect failure.
* <p>The default implementation checks for CORBA's
* {@link org.omg.CORBA.OBJECT_NOT_EXIST} exception.
* @param ex the RMI exception to check
* @return whether the exception should be treated as connect failure
*/
protected boolean isConnectFailure(SystemException ex) {
return (ex instanceof OBJECT_NOT_EXIST);
}
/**
* Refresh the stub and retry the remote invocation if necessary.
* <p>If not configured to refresh on connect failure, this method
@ -402,9 +369,6 @@ public class JndiRmiClientInterceptor extends JndiObjectLocator implements Metho
catch (RemoteException ex) {
throw convertRmiAccessException(ex, invocation.getMethod());
}
catch (SystemException ex) {
throw convertCorbaAccessException(ex, invocation.getMethod());
}
catch (InvocationTargetException ex) {
throw ex.getTargetException();
}
@ -423,9 +387,6 @@ public class JndiRmiClientInterceptor extends JndiObjectLocator implements Metho
if (targetEx instanceof RemoteException) {
throw convertRmiAccessException((RemoteException) targetEx, invocation.getMethod());
}
else if (targetEx instanceof SystemException) {
throw convertCorbaAccessException((SystemException) targetEx, invocation.getMethod());
}
else {
throw targetEx;
}
@ -483,27 +444,4 @@ public class JndiRmiClientInterceptor extends JndiObjectLocator implements Metho
return RmiClientInterceptorUtils.convertRmiAccessException(method, ex, isConnectFailure(ex), getJndiName());
}
/**
* Convert the given CORBA SystemException that happened during remote access
* to Spring's RemoteAccessException if the method signature does not declare
* RemoteException. Else, return the SystemException wrapped in a RemoteException.
* @param method the invoked method
* @param ex the RemoteException that happened
* @return the exception to be thrown to the caller
*/
private Exception convertCorbaAccessException(SystemException ex, Method method) {
if (ReflectionUtils.declaresException(method, RemoteException.class)) {
// A traditional RMI service: wrap CORBA exceptions in standard RemoteExceptions.
return new RemoteException("Failed to access CORBA service [" + getJndiName() + "]", ex);
}
else {
if (isConnectFailure(ex)) {
return new RemoteConnectFailureException("Could not connect to CORBA service [" + getJndiName() + "]", ex);
}
else {
return new RemoteAccessException("Could not access CORBA service [" + getJndiName() + "]", ex);
}
}
}
}

5
fine-spring/src/com/fr/third/springframework/remoting/rmi/JndiRmiServiceExporter.java

@ -22,7 +22,6 @@ import java.rmi.RemoteException;
import java.util.Properties;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import com.fr.third.springframework.beans.factory.DisposableBean;
import com.fr.third.springframework.beans.factory.InitializingBean;
@ -32,7 +31,6 @@ import com.fr.third.springframework.jndi.JndiTemplate;
* Service exporter which binds RMI services to JNDI.
* Typically used for RMI-IIOP (CORBA).
*
* <p>Exports services via the {@link javax.rmi.PortableRemoteObject} class.
* You need to run "rmic" with the "-iiop" option to generate corresponding
* stubs and skeletons for each exported service.
*
@ -64,7 +62,6 @@ import com.fr.third.springframework.jndi.JndiTemplate;
* @see #setJndiName
* @see JndiRmiClientInterceptor
* @see JndiRmiProxyFactoryBean
* @see javax.rmi.PortableRemoteObject#exportObject
*/
public class JndiRmiServiceExporter extends RmiBasedExporter implements InitializingBean, DisposableBean {
@ -118,7 +115,6 @@ public class JndiRmiServiceExporter extends RmiBasedExporter implements Initiali
// Initialize and cache exported object.
this.exportedObject = getObjectToExport();
PortableRemoteObject.exportObject(this.exportedObject);
rebind();
}
@ -144,7 +140,6 @@ public class JndiRmiServiceExporter extends RmiBasedExporter implements Initiali
logger.info("Unbinding RMI service from JNDI location [" + this.jndiName + "]");
}
this.jndiTemplate.unbind(this.jndiName);
PortableRemoteObject.unexportObject(this.exportedObject);
}
}

9
fine-spring/src/com/fr/third/springframework/remoting/rmi/RmiClientInterceptorUtils.java

@ -29,10 +29,6 @@ import java.rmi.UnknownHostException;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.omg.CORBA.COMM_FAILURE;
import org.omg.CORBA.CompletionStatus;
import org.omg.CORBA.NO_RESPONSE;
import org.omg.CORBA.SystemException;
import com.fr.third.springframework.remoting.RemoteAccessException;
import com.fr.third.springframework.remoting.RemoteConnectFailureException;
@ -184,8 +180,9 @@ public abstract class RmiClientInterceptorUtils {
* @param ex the RMI exception to check
*/
private static boolean isCorbaConnectFailure(Throwable ex) {
return ((ex instanceof COMM_FAILURE || ex instanceof NO_RESPONSE) &&
((SystemException) ex).completed == CompletionStatus.COMPLETED_NO);
return (ex instanceof ConnectException || ex instanceof ConnectIOException ||
ex instanceof UnknownHostException || ex instanceof NoSuchObjectException ||
ex instanceof StubNotFoundException || ex.getCause() instanceof SocketException);
}
}

1
fine-spring/src/com/fr/third/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java

@ -76,7 +76,6 @@ import com.fr.third.springframework.web.servlet.mvc.method.annotation.ExceptionH
import com.fr.third.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import com.fr.third.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import com.fr.third.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver;
import com.sun.prism.impl.BaseContext;
/**
* This is the main class providing the configuration behind the MVC Java config.

Loading…
Cancel
Save