将httpcontext注入.net core中控制器外部的自定义属性中

时间:2019-06-11 07:55:44

标签: asp.net-core .net-core custom-attributes httpcontext filterattribute

我需要将httpcontext注入到在控制器外部使用的自定义属性中。我在控制器中找到了几种解决方案,但是我的情况有点棘手。现在,我的PermissionController中有以下代码

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Property fr.hatvp.parsatorApp.model.Rubrique.items has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at fr.hatvp.parsatorApp.ParsatorApplication.main(ParsatorApplication.java:17) [classes/:na]
Caused by: org.hibernate.AnnotationException: Property fr.hatvp.parsatorApp.model.Rubrique.items has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type

在上述方法中,调用了扩展方法[PermissionFilter(PermissionEnum.Permission, AccessLevelEnum.Create)] <-- it works perfectly [HttpPost("users/{userId}")] public async Task<IActionResult> AssignPermissionToUser([FromBody] List<PermissionToVM> permissions, int userId) { await _permissionService.Assign(permissions); <-- .Assign() extension //code goes here } 。此方法代码如下。

.Assign

正如我访问过许多网站所提到的此处https://dotnetcoretutorials.com/2017/01/05/accessing-httpcontext-asp-net-core/可以使用IHttpContextAccessor在控制器外部注入httpcontext。问题是我不知道如何在不将其传递给构造函数的情况下使用它。当仅应传递权限设置时,我的自定义属性应称为装饰器//[SecondPermissionFilter(PermissionEnum.Permission, AccessLevelEnum.Create)] <-- here I check permissions but don't know how to inject the httpcontext public async Task Assign(List<PermissionToVM> permissions) { //code goes here } ,因此没有对httpcontextaccessor的任何引用。

这甚至可能吗?如果没有,也许还有另一种方法?

编辑:这是[SecondPermissionFilter(PermissionEnum.Permission, AccessLevelEnum.Create)]类的代码:

SecondPermissionFilter

1 个答案:

答案 0 :(得分:2)

您追求的是Property Injection。根据{{​​3}} ,. NET Core DI容器不提供开箱即用的支持。

但是,您可以使用official docsNinject之类的第三方库-两者均可通过NuGet获得。

我认为Ninject语法更好,但{em> {em} 如Autofac所述,而this answer属性注入本身被认为是不好的做法。因此,如果可能的话,我会尽量避免。

因此,您应该使用过滤器this answer指定的三种方法之一,documentation会使事情分解得更多。

修改

this answer具体涉及属性注入,This answer看起来无需外部依赖即可实现。