针对asp.net-mvc–ErrorAttributevsOnException与Application_Error和.net和vs区别这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展.n
针对asp.net-mvc – ErrorAttribute vs OnException与Application_Error和.net和vs区别这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展.net – Application_Error不会触发?、android.content.OperationApplicationException的实例源码、Application run failed org.springframework.beans.factory.BeanCreationException: Error creating b...、ASP.NET Core MVC 授权的扩展:自定义 Authorize Attribute 和 IApplicationModelProvide等相关知识,希望可以帮助到你。
本文目录一览:- asp.net-mvc – ErrorAttribute vs OnException与Application_Error(.net和vs区别)
- .net – Application_Error不会触发?
- android.content.OperationApplicationException的实例源码
- Application run failed org.springframework.beans.factory.BeanCreationException: Error creating b...
- ASP.NET Core MVC 授权的扩展:自定义 Authorize Attribute 和 IApplicationModelProvide
asp.net-mvc – ErrorAttribute vs OnException与Application_Error(.net和vs区别)
有3种方法(或我知道).
1) ErrorAttribute in BaseController:Controller class. Can be used on individual Action/Controller/BaseController. 2) Override OnException() in the BaseController:Controller class. Will work on Controllers derived from BaseController 3) Application_Error in Global_aspx.
最好的做法是什么
这些方法中的哪一种应用于应用范围广泛的错误处理,或者我们应该使用多个或仅一个.
如果我们在BaseController上处理ErrorAttribute Or / And OnException()的错误,那么我们仍然在Application_Error()中处理它.
我们什么时候应用Application_Error()?
解决方法
> Controller.OnException是一种方法,如果您的任何操作最终导致错误,该方法将被调用.
>上述两者都是MVC概念和MVC管道的一部分,它位于ASP.NET流水线之上,如果使用上述处理异常,它将不会传播到Application_Error,而是像http错误404,500,如果我记得正确的话.
有什么用?
肯定地看看ELMAH的应用范围的错误记录和我的blog post关于ELMAH和ASP.NET MVC
关于显示错误页面,只要使用[HandleError]和HandleErrorAttribute即可,因为它已经处理了所有内容(可选过滤和每个异常类型的可选自定义错误页面).
.net – Application_Error不会触发?
protected void Page_Load(object sender,EventArgs e) { throw new Exception("test exception"); }
在Global.asax.cs中:
protected void Application_Error(object sender,EventArgs e) { // Code that runs when an unhandled error occurs if (Server.GetLastError() is HttpUnhandledException) Server.Transfer("ErrUnkNown.aspx"); }
但是从不调用Application_Error事件处理程序.相反,我得到一个运行时错误页面.
在抛出异常后,我需要做什么才能调用Application_Error?
解决方法
您是否通过调试应用程序进行了检查?
实际上你缺少Server.ClearError()所以异常被传递给asp.net但你应该在这里压制它,因为你自己处理它.
protected void Application_Error(object sender,EventArgs e) { // Code that runs when an unhandled error occurs if (Server.GetLastError() is HttpUnhandledException) { // suppressing the error so it should not pass to asp.net Server.ClearError(); Server.Transfer("ErrUnkNown.aspx"); } }
android.content.OperationApplicationException的实例源码
/** * Apply the given set of {@link ContentProviderOperation},executing inside * a {@link sqliteDatabase} transaction. All changes will be rolled back if * any single one fails. */ public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { final sqliteDatabase db = mOpenHelper.getWritableDatabase(); db.beginTransaction(); try { final int numOperations = operations.size(); final ContentProviderResult[] results = new ContentProviderResult[numOperations]; for (int i = 0; i < numOperations; i++) { results[i] = operations.get(i).apply(this,results,i); } db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); } }
@NonNull @Override public ContentProviderResult[] applyBatch(@NonNull ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { ContentProviderResult[] result = null; isApplyingBatch = true; final sqliteDatabase db = db(); db.beginTransaction(); try { result = super.applyBatch(operations); db.setTransactionSuccessful(); } finally { db.endTransaction(); isApplyingBatch = false; } return result; }
private void flushApksToDbInBatch(Map<String,Long> appIds) throws RepoUpdater.UpdateException { List<Apk> apksToSaveList = new ArrayList<>(); for (Map.Entry<String,List<Apk>> entries : apksToSave.entrySet()) { for (Apk apk : entries.getValue()) { apk.appId = appIds.get(apk.packageName); } apksToSaveList.addAll(entries.getValue()); } calcApkCompatibilityFlags(apksToSaveList); ArrayList<ContentProviderOperation> apkOperations = insertApks(apksToSaveList); try { context.getContentResolver().applyBatch(TempApkProvider.getAuthority(),apkOperations); } catch (remoteexception | OperationApplicationException e) { throw new RepoUpdater.UpdateException(repo,"An internal error occurred while updating the database",e); } }
private static @NonNull RefreshResult updateContactsDatabase(@NonNull Context context,@NonNull String localNumber,@NonNull List<ContactTokenDetails> activetokens,boolean removeMissing) { Optional<AccountHolder> account = getorCreateAccount(context); if (account.isPresent()) { try { List<String> newUsers = DatabaseFactory.getContactsDatabase(context) .setRegisteredUsers(account.get().getAccount(),localNumber,activetokens,removeMissing); return new RefreshResult(newUsers,account.get().isFresh()); } catch (remoteexception | OperationApplicationException e) { Log.w(TAG,e); } } return new RefreshResult(new LinkedList<String>(),false); }
/** * Apply the given set of {@link ContentProviderOperation},i); } db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); } }
@Override public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { ContentProviderResult[] results; sqliteDatabase db = mOpenHelper.getWritableDatabase(); db.beginTransaction(); try { inBatch.set(true); results = super.applyBatch(operations); inBatch.set(false); db.setTransactionSuccessful(); } finally { db.endTransaction(); } notifyChange(); return results; }
/** * Since old repository URL Could be used,do not actually update the existing record,* but create a new one. */ public static int updateUrl(Context mContext,long id,String url) { ArrayList<ContentProviderOperation> ops = new ArrayList<>(); ops.add(ContentProviderOperation .newDelete(ContentUris.withAppendedId(ProviderContract.Repos.ContentUri.repos(),id)) .build()); ops.add(ContentProviderOperation .newInsert(ProviderContract.Repos.ContentUri.repos()) .withValue(ProviderContract.Repos.Param.REPO_URL,url) .build()); try { mContext.getContentResolver().applyBatch(ProviderContract.AUTHORITY,ops); } catch (remoteexception | OperationApplicationException e) { e.printstacktrace(); throw new RuntimeException(e); } return 1; }
public static void set(Context context,List<VersionedRook> books) { ArrayList<ContentProviderOperation> ops = new ArrayList<>(); /* Delete all prevIoUs. */ ops.add(ContentProviderOperation .newDelete(ProviderContract.CurrentRooks.ContentUri.currentRooks()) .build()); /* Insert each one. */ for (VersionedRook book: books) { ContentValues values = new ContentValues(); CurrentRooksClient.toContentValues(values,book); ops.add(ContentProviderOperation .newInsert(ProviderContract.CurrentRooks.ContentUri.currentRooks()) .withValues(values) .build()); } try { context.getContentResolver().applyBatch(ProviderContract.AUTHORITY,ops); } catch (remoteexception | OperationApplicationException e) { e.printstacktrace(); } }
public static int delete(Context context,long[] noteIds) { int deleted = 0; ArrayList<ContentProviderOperation> ops = new ArrayList<>(); for (long noteId: noteIds) { ops.add(ContentProviderOperation .newDelete(ProviderContract.Notes.ContentUri.notes()) .withSelection(ProviderContract.Notes.UpdateParam._ID + "=" + noteId,null) .build() ); } try { context.getContentResolver().applyBatch(ProviderContract.AUTHORITY,ops); } catch (remoteexception | OperationApplicationException e) { e.printstacktrace(); throw new RuntimeException(e); } if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG,"Deleted " + deleted + " notes"); return deleted; }
@NonNull @Override public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { try { Field uriField = ContentProviderOperation.class.getDeclaredField("mUri"); uriField.setAccessible(true); for (ContentProviderOperation operation : operations) { Uri pluginUri = Uri.parse(operation.getUri().getQueryParameter(KEY_URI)); uriField.set(operation,pluginUri); } } catch (Exception e) { return new ContentProviderResult[0]; } if (operations.size() > 0) { ContentProvider provider = getContentProvider(operations.get(0).getUri()); if (provider != null) { return provider.applyBatch(operations); } } return new ContentProviderResult[0]; }
@NonNull @Override public ContentProviderResult[] applyBatch( @NonNull ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { final Context context = getContext(); if (context == null) { return new ContentProviderResult[0]; } final SampleDatabase database = SampleDatabase.getInstance(context); database.beginTransaction(); try { final ContentProviderResult[] result = super.applyBatch(operations); database.setTransactionSuccessful(); return result; } finally { database.endTransaction(); } }
@Test public void cheese_applyBatch() throws remoteexception,OperationApplicationException { final ArrayList<ContentProviderOperation> operations = new ArrayList<>(); operations.add(ContentProviderOperation .newInsert(SampleContentProvider.URI_CHEESE) .withValue(Cheese.COLUMN_NAME,"Peynir") .build()); operations.add(ContentProviderOperation .newInsert(SampleContentProvider.URI_CHEESE) .withValue(Cheese.COLUMN_NAME,"Queso") .build()); final ContentProviderResult[] results = mContentResolver.applyBatch( SampleContentProvider.AUTHORITY,operations); assertthat(results.length,is(2)); final Cursor cursor = mContentResolver.query(SampleContentProvider.URI_CHEESE,new String[]{Cheese.COLUMN_NAME},null,null); assertthat(cursor,notNullValue()); assertthat(cursor.getCount(),is(2)); assertthat(cursor.movetoFirst(),is(true)); cursor.close(); }
/** * Apply the given set of {@link ContentProviderOperation},executing inside * a {@link sqliteDatabase} transaction. All changes will be rolled back if * any single one fails. */ @Override public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { final sqliteDatabase db = mOpenHelper.getWritableDatabase(); db.beginTransaction(); try { final int numOperations = operations.size(); final ContentProviderResult[] results = new ContentProviderResult[numOperations]; for (int i = 0; i < numOperations; i++) { results[i] = operations.get(i).apply(this,i); } db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); } }
private static @NonNull RefreshResult updateContactsDatabase(@NonNull Context context,false); }
@Override public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { if (DBG) Log.d(TAG,"applyBatch"); ContentProviderResult[] result = null; sqliteDatabase db = mDbHolder.get(); db.beginTransaction(); try { result = super.applyBatch(operations); db.setTransactionSuccessful(); } finally { db.endTransaction(); } if (result != null) { mCr.notifyChange(MusicStore.ALL_CONTENT_URI,null); } return result; }
@Override public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { sqliteDatabase db = mDbHolder.get(); db.beginTransaction(); ContentProviderResult[] result = null; try { result = super.applyBatch(operations); db.setTransactionSuccessful(); ContentResolver res = mCr; res.notifyChange(ScraperStore.ALL_CONTENT_URI,null); return result; } finally { db.endTransaction(); } }
@Override public void transactionSuccess() { try { ContentProviderResult[] cpr = context.getContentResolver().applyBatch( dsUri.getAuthority(),trans); if(cpr == null || cpr.length != trans.size()){ throw new DaoException(); } for (int i = 0; i < cpr.length; i++) { if (cpr[i] == null || ( cpr[i].count == null && cpr[i].uri == null)) { throw new DaoException(); } } } catch (remoteexception | OperationApplicationException e) { throw new DaoException(); } finally { trans = null; } }
@Override public ContentProviderResult[] applyBatch( ArrayList<ContentProviderOperation> operations ) throws OperationApplicationException { ContentProviderResult[] contentProviderResults; try { getWritableDatabase().beginTransaction(); contentProviderResults = new ContentProviderResult[operations .size()]; int i = 0; for (ContentProviderOperation cpo : operations) { contentProviderResults[i] = cpo.apply(this,contentProviderResults,i); if(contentProviderResults[i] == null || (contentProviderResults[i].count == null && contentProviderResults[i].uri == null)){ throw new DaoException(); } i++; } getWritableDatabase().setTransactionSuccessful(); } finally{ if (getWritableDatabase().inTransaction()) { getWritableDatabase().endTransaction(); } } return contentProviderResults; }
/** * Apply the given set of {@link ContentProviderOperation},executing inside * a {@link sqliteDatabase} transaction. All changes will be rolled back if * any single one fails. */ @Override public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { final sqliteDatabase db = mDatabaseHelper.getWritableDatabase(); db.beginTransaction(); try { final int numOperations = operations.size(); final ContentProviderResult[] results = new ContentProviderResult[numOperations]; for (int i = 0; i < numOperations; i++) { results[i] = operations.get(i).apply(this,i); } db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); } }
/** * Apply the given set of {@link ContentProviderOperation},executing inside * a {@link sqliteDatabase} transaction. All changes will be rolled back if * any single one fails. */ @NonNull @Override public ContentProviderResult[] applyBatch(@NonNull ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { final sqliteDatabase db = mOpenHelper.getWritableDatabase(); db.beginTransaction(); try { final int numOperations = operations.size(); final ContentProviderResult[] results = new ContentProviderResult[numOperations]; for (int i = 0; i < numOperations; i++) { results[i] = operations.get(i).apply(this,i); } db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); } }
/** * Apply the given set of {@link ContentProviderOperation},i); } db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); } }
@Override protected Void doInBackground(Void... params) { @DvrStorageStatusManager.StorageStatus int storageStatus = getDvrStorageStatus(); if (storageStatus == DvrStorageStatusManager.STORAGE_STATUS_MISSING) { return null; } List<ContentProviderOperation> ops = getDeleteOps(storageStatus == DvrStorageStatusManager.STORAGE_STATUS_TOTAL_CAPACITY_TOO_SMALL); if (ops == null || ops.isEmpty()) { return null; } Log.i(TAG,"New device storage mounted. # of recordings to be forgotten : " + ops.size()); for (int i = 0 ; i < ops.size() && !isCancelled() ; i += BATCH_OPERATION_COUNT) { int toIndex = (i + BATCH_OPERATION_COUNT) > ops.size() ? ops.size() : (i + BATCH_OPERATION_COUNT); ArrayList<ContentProviderOperation> batchOps = new ArrayList<>(ops.subList(i,toIndex)); try { mContext.getContentResolver().applyBatch(TvContract.AUTHORITY,batchOps); } catch (remoteexception | OperationApplicationException e) { Log.e(TAG,"Failed to clean up RecordedPrograms.",e); } } return null; }
public void scannedChannelHandlingCompleted() { mIsScanning.set(false); if (!mPrevIoUsScannedChannels.isEmpty()) { ArrayList<ContentProviderOperation> ops = new ArrayList<>(); for (TunerChannel channel : mPrevIoUsScannedChannels) { ops.add(ContentProviderOperation.newDelete( TvContract.buildChannelUri(channel.getChannelId())).build()); } try { mContext.getContentResolver().applyBatch(TvContract.AUTHORITY,ops); } catch (remoteexception | OperationApplicationException e) { Log.e(TAG,"Error deleting obsolete channels",e); } } if (mChannelScanListener != null && mChannelScanHandler != null) { mChannelScanHandler.post(new Runnable() { @Override public void run() { mChannelScanListener.onChannelHandlingDone(); } }); } else { Log.e(TAG,"Error. mChannelScanListener is null."); } }
@Override public ContentProviderResult[] applyBatch (ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { Log_OC.d("FileContentProvider","applying batch in provider " + this + " (temporary: " + istemporary() + ")" ); ContentProviderResult[] results = new ContentProviderResult[operations.size()]; int i=0; sqliteDatabase db = mDbHelper.getWritableDatabase(); db.beginTransaction(); // it's supposed that transactions can be nested try { for (ContentProviderOperation operation : operations) { results[i] = operation.apply(this,i); i++; } db.setTransactionSuccessful(); } finally { db.endTransaction(); } Log_OC.d("FileContentProvider","applied batch in provider " + this); return results; }
/** * Apply the given set of {@link ContentProviderOperation},i); } db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); } }
public static Uri add(ContactSpec spec) { // original code http://stackoverflow.com/questions/4744187/how-to-add-new-contacts-in-android // good blog http://androiddevelopement.blogspot.de/2011/07/insert-update-delete-view-contacts-in.html ArrayList<ContentProviderOperation> ops = new ArrayList<>(); addContactBase(ops); addContactdisplayName(spec,ops); addContactAddress(spec,ops); try { ContentProviderResult[] results = InstrumentationRegistry.getTargetContext().getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops); return results[0].uri; } catch (remoteexception | OperationApplicationException e) { throw new IllegalStateException("Could not add contact",e); } }
@Override public @NonNull ContentProviderResult[] applyBatch(@NonNull ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { final sqliteDatabase db = helper.getWritableDatabase(); db.beginTransaction(); try { final ContentProviderResult[] results = super.applyBatch(operations); db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); } }
@Override public ContentProviderResult[] applyBatch( ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { /*sqliteDatabase db = sqlOpenHelper.getWritableDatabase(); isInBatchMode.set(true); db.beginTransaction(); try { final ContentProviderResult[] retResult = super.applyBatch(operations); db.setTransactionSuccessful(); getContext().getContentResolver().notifyChange(ApparelContract.CONTENT_URI,null); return retResult; } finally { isInBatchMode.remove(); db.endTransaction(); }*/ return null; }
/** * Apply the given set of {@link ContentProviderOperation},executing inside * a {@link sqliteDatabase} transaction. All changes will be rolled back if * any single one fails. */ @Override public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { final sqliteDatabase db = mDbHelper.getWritableDatabase(); db.beginTransaction(); try { final int numOperations = operations.size(); final ContentProviderResult[] results = new ContentProviderResult[numOperations]; for (int i = 0; i < numOperations; i++) { results[i] = operations.get(i).apply(this,i); } db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); } }
/** * Apply the given set of {@link ContentProviderOperation},i); } db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); } }
private void deleteMultiContract(List<Contact> contacts) { showProgressDialog(); ArrayList<ContentProviderOperation> ops = new ArrayList<>(); for (int i = 0; i < contacts.size(); i++) { Log.d(TAG,"deleteMultiContract contacts.dataId == " + contacts.get(i).dataId + ",name == " + contacts.get(i).displayName); ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) .withSelection(ContactsContract.Data._ID + "=?",new String[]{contacts.get(i).dataId}) .build()); } try { getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops); } catch (remoteexception | OperationApplicationException e) { e.printstacktrace(); } UpdateContactService.updateContacts(MainActivity.this,(ArrayList<Contact>) contacts); mHandler.postDelayed(new Runnable() { @Override public void run() { mContactTask = new HandleContactTask(); mContactTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } },100); }
/** * Apply the given set of {@link ContentProviderOperation},executing inside * a {@link sqliteDatabase} transaction. All changes will be rolled back if * any single one fails. */ @NonNull public ContentProviderResult[] applyBatch(@NonNull ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { final sqliteDatabase db = mOpenHelper.getWritableDatabase(); db.beginTransaction(); try { final int numOperations = operations.size(); final ContentProviderResult[] results = new ContentProviderResult[numOperations]; for (int i = 0; i < numOperations; i++) { results[i] = operations.get(i).apply(this,i); } db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); } }
void fixContactPhonetic(Set<ContactLite> contactIds) { ArrayList<ContentProviderOperation> ops = new ArrayList<>(); for (ContactLite contact : contactIds) { ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) .withSelection( String.format("%s = ?",ContactsContract.Data._ID),new String[]{String.valueOf(contact.dataId)}) .withValue(ContactsContract.CommonDataKinds.Structuredname.PHONETIC_GIVEN_NAME,contact.phoneticGivenname) .withValue(ContactsContract.CommonDataKinds.Structuredname.PHONETIC_MIDDLE_NAME,contact.phoneticMiddleName) .withValue(ContactsContract.CommonDataKinds.Structuredname.PHONETIC_FAMILY_NAME,contact.phoneticFamilyName) .withValue(ContactsContract.CommonDataKinds.Structuredname.PHONETIC_NAME_STYLE,contact.phoneticNameStyle) .build()); } try { context.getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops); } catch (remoteexception | OperationApplicationException e) { Log.e(TAG,"Error when updating",e); } Log.i(TAG,"Fix done:" + contactIds.size()); }
private void updateCache() { ArrayList<ContentProviderOperation> ops = new ArrayList<>(); ops.addAll(deleteFromCache(toDelete)); ops.addAll(insertIntoCache(toInsert)); if (ops.size() > 0) { try { context.getContentResolver().applyBatch(InstalledAppProvider.getAuthority(),ops); Utils.debugLog(TAG,"Finished executing " + ops.size() + " CRUD operations on installed app cache."); } catch (remoteexception | OperationApplicationException e) { Log.e(TAG,"Error updating installed app cache: " + e); } } }
@NonNull @Override public ContentProviderResult[] applyBatch(@NonNull ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { ContentProviderResult[] result = null; isApplyingBatch = true; final sqliteDatabase db = db(); db.beginTransaction(); try { result = super.applyBatch(operations); db.setTransactionSuccessful(); } finally { db.endTransaction(); isApplyingBatch = false; } return result; }
private void flushApksToDbInBatch() throws RepoUpdater.UpdateException { List<Apk> apksToSaveList = new ArrayList<>(); for (Map.Entry<String,List<Apk>> entries : apksToSave.entrySet()) { apksToSaveList.addAll(entries.getValue()); } calcApkCompatibilityFlags(apksToSaveList); ArrayList<ContentProviderOperation> apkOperations = new ArrayList<>(); ContentProviderOperation clearOrphans = deleteOrphanedApks(appsToSave,apksToSave); if (clearOrphans != null) { apkOperations.add(clearOrphans); } apkOperations.addAll(insertOrUpdateApks(apksToSaveList)); try { context.getContentResolver().applyBatch(TempApkProvider.getAuthority(),e); } }
private void updateCache() { ArrayList<ContentProviderOperation> ops = new ArrayList<>(); ops.addAll(deleteFromCache(toDelete)); ops.addAll(insertIntoCache(toInsert)); if (ops.size() > 0) { try { context.getContentResolver().applyBatch(InstalledAppProvider.getAuthority(),"Error updating installed app cache: " + e); } } }
private void flushApksToDbInBatch() throws RepoUpdater.UpdateException { List<Apk> apksToSaveList = new ArrayList<>(); for (Map.Entry<String,e); } }
public synchronized static void updateEvent(Context context,Contact contact,DateUnkNownYear newBirthday) throws EventException { // Todo UNIFORMISE for (CalendarEvent event : getEventsSavedOrCreateNewsForEachYear(context,contact)) { // Construct each anniversary of new birthday int year = new DateTime(event.getDate()).getYear(); Date newBirthdayDate = DateUnkNownYear.getDateWithYear(newBirthday.getDate(),year); event.setDateStart(newBirthdayDate); event.setAllDay(true); ArrayList<ContentProviderOperation> operations = new ArrayList<>(); ContentProviderOperation contentProviderOperation = EventProvider.update(event); operations.add(contentProviderOperation); try { ContentProviderResult[] contentProviderResults = context.getContentResolver().applyBatch(CalendarContract.AUTHORITY,operations); for(ContentProviderResult contentProviderResult : contentProviderResults) { if (contentProviderResult.count != 0) Log.d(TAG,"Update event : " + event.toString()); } } catch (remoteexception|OperationApplicationException e) { Log.e(TAG,"Unable to update event : " + e.getMessage()); } } }
public synchronized static void deleteEventsFromContact(Context context,Contact contact) { ArrayList<ContentProviderOperation> operations = new ArrayList<>(); try { for (CalendarEvent event : getEventsSavedForEachYear(context,contact)) { operations.add(ReminderProvider.deleteall(context,event.getId())); operations.add(EventProvider.delete(event)); } ContentProviderResult[] contentProviderResults = context.getContentResolver().applyBatch(CalendarContract.AUTHORITY,operations); for(ContentProviderResult contentProviderResult : contentProviderResults) { Log.d(TAG,contentProviderResult.toString()); if (contentProviderResult.uri != null) Log.d(TAG,contentProviderResult.uri.toString()); } } catch (remoteexception |OperationApplicationException |EventException e) { Log.e(TAG,"Unable to deleteById events : " + e.getMessage()); } }
Application run failed org.springframework.beans.factory.BeanCreationException: Error creating b...
目前有发现的两种情况
第一种:是在继承jpa的时候检查实体类@id和@Entity引进的包是否是
import javax.persistence.Id
imprt javax.persistence.Entity;
import javax.persistence.Table;
第一次引进很容易引错包下面是错误的包
org.springframework.data.annotation.Id;
要不然你就得去找找你的dao与service的注解是不是漏掉了
第二种:情况属于比较少见的
无法注入Dao中的Bean!
SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描! “Application类”是指SpringBoot项目入口类。这个类的位置很关键:
如果Application类所在的包为:com.ssm.springboot
,则只会扫描com.ssm.springboot
包及其所有子包,如果service或dao所在包不在com.ssm.springboot
及其子包下,则不会被扫描!
这种情况也会导致注入不进去的错误
解决办法
将SpringbootApplication放在要扫描包包中
一定不要如下图另起一个包要不然
@ComponentScan他也救不了你
最简单的你是这样了
放置于自动扫描包的同一包名下
ASP.NET Core MVC 授权的扩展:自定义 Authorize Attribute 和 IApplicationModelProvide
一、概述
ASP.NET Core MVC
提供了基于角色( Role
)、声明( Chaim
) 和策略 ( Policy
) 等的授权方式。在实际应用中,可能采用部门( Department
, 本文采用用户组 Group
)、职位 ( 可继续沿用 Role
)、权限( Permission
)的方式进行授权。要达到这个目的,仅仅通过自定义 IAuthorizationPolicyProvider
是不行的。本文通过自定义 IApplicationModelProvide
进行扩展。
二、PermissionAuthorizeAttribute : IPermissionAuthorizeData
AuthorizeAttribute
类实现了 IAuthorizeData
接口:
|
|
使用 AuthorizeAttribute 不外乎如下几种形式:
|
|
当然,参数还可以组合起来。另外,Roles 和 AuthenticationSchemes 的值以半角逗号分隔,是 Or
的关系;多个 Authorize 是 And
的关系;Policy 、Roles 和 AuthenticationSchemes 如果同时使用,也是 And
的关系。
如果要扩展 AuthorizeAttribute,先扩展 IAuthorizeData 增加新的属性:
|
|
然后定义 AuthorizeAttribute:
|
|
现在,在 Controller 或 Action 上就可以这样使用了:
|
|
数据已经准备好,下一步就是怎么提取出来。通过扩展 AuthorizationApplicationModelProvider 来实现。
三、PermissionAuthorizationApplicationModelProvider : IApplicationModelProvider
AuthorizationApplicationModelProvider
类的作用是构造 AuthorizeFilter
对象放入 ControllerModel
或 ActionModel
的 Filters
属性中。具体过程是先提取 Controller 和 Action 实现了 IAuthorizeData
接口的 Attribute,如果使用的是默认的DefaultAuthorizationPolicyProvider
,则会先创建一个 AuthorizationPolicy
对象作为 AuthorizeFilter
构造函数的参数。
创建 AuthorizationPolicy
对象是由 AuthorizationPolicy
的静态方法 public static async Task<AuthorizationPolicy> CombineAsync(IAuthorizationPolicyProvider policyProvider, IEnumerable<IAuthorizeData> authorizeData)
来完成的。该静态方法会解析 IAuthorizeData
的数据,但不懂解析 IPermissionAuthorizeData
。
因为 AuthorizationApplicationModelProvider
类对 AuthorizationPolicy.CombineAsync
静态方法有依赖,这里不得不做一个类似的 PermissionAuthorizationApplicationModelProvider
类,在本类实现 CombineAsync
方法。暂且不论该方法放在本类是否合适的问题。
|
|
if(authorizeDatum is IPermissionAuthorizeData permissionAuthorizeDatum )
为扩展部分。
四、Startup
注册 PermissionAuthorizationApplicationModelProvider
服务,需要在 AddMvc
之后替换掉 AuthorizationApplicationModelProvider
服务。
|
|
五、Jwt 示例
|
|
六、问题
AuthorizeFilter
类显示实现了 IFilterFactory
接口的 CreateInstance
方法:
|
|
竟然对 AuthorizationApplicationModelProvider.GetFilter
静态方法产生了依赖。庆幸的是,如果通过 AuthorizeFilter(IAuthorizationPolicyProvider policyProvider, IEnumerable<IAuthorizeData> authorizeData)
或 AuthorizeFilter(AuthorizationPolicy policy)
创建 AuthorizeFilter
对象不会产生什么不良影响。
七、下一步
[PermissionAuthorize(Groups = "研发部,生产部", Roles = "经理", Permissions = "请假审批"]
这种形式还是不够灵活,哪怕用多个 Attribute, And
和 Or
的逻辑组合不一定能满足需求。可以在 IPermissionAuthorizeData
新增一个 Rule
属性,实现类似的效果:
|
|
通过 Rule
计算复杂的授权。
八、如果通过自定义 IAuthorizationPolicyProvider 实现?
另一种方式是自定义 IAuthorizationPolicyProvider
,不过还需要自定义 AuthorizeFilter
。因为当不是使用 DefaultAuthorizationPolicyProvider
而是自定义 IAuthorizationPolicyProvider
时,AuthorizationApplicationModelProvider
(或前文定义的 PermissionAuthorizationApplicationModelProvider
)会使用 AuthorizeFilter(IAuthorizationPolicyProvider policyProvider, IEnumerable<IAuthorizeData> authorizeData)
创建 AuthorizeFilter
对象,而不是 AuthorizeFilter(AuthorizationPolicy policy)
。这会造成 AuthorizeFilter
对象在 OnAuthorizationAsync
时会间接调用 AuthorizationPolicy.CombineAsync
静态方法。
这可以说是一个设计上的缺陷,不应该让 AuthorizationPolicy.CombineAsync
静态方法存在,哪怕提供个 IAuthorizationPolicyCombiner
也好。另外,上文提到的 AuthorizationApplicationModelProvider.GetFilter
静态方法同样不是一种好的设计。等微软想通吧。
参考资料
https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/iauthorizationpolicyprovider?view=aspnetcore-2.1
排版问题:http://blog.tubumu.com/2018/11/28/aspnetcore-mvc-extend-authorization/
今天关于asp.net-mvc – ErrorAttribute vs OnException与Application_Error和.net和vs区别的讲解已经结束,谢谢您的阅读,如果想了解更多关于.net – Application_Error不会触发?、android.content.OperationApplicationException的实例源码、Application run failed org.springframework.beans.factory.BeanCreationException: Error creating b...、ASP.NET Core MVC 授权的扩展:自定义 Authorize Attribute 和 IApplicationModelProvide的相关知识,请在本站搜索。
本文标签: