我认为这是一个简单的问题,但我的谷歌搜索在这方面很弱.
关于生成的ID和级联,我遇到了以下链接中描述的问题:
https://www.hibernate.org/hib_docs/nhibernate/html/example-parentchild.html(向下)
我使用他们建议的拦截器方法修复它.一切似乎都在起作用,所以我很开心.
也就是说,我不知道返回值的重要性来自以下方法:
public override bool OnLoad(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
if (entity is Persistent) ((Persistent)entity).OnLoad();
return false;
}
public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
if (entity is Persistent) ((Persistent)entity).OnSave();
return false;
}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下都会返回false.
当我谷歌关于NHibernate拦截器时,我看到了很多关于如何编写一个的例子.有些反而返回true(http://www.lostechies.com/blogs/rhouston/archive/2008/03/27/creating-a-timestamp-interceptor-in-nhibernate.aspx).我不知道这里的区别是什么.我的代码正在运行,但拦截器对我来说似乎很有用,所以我希望能有更好的理解.
我已经定义了一个拦截器如下:
<package name="default" extends="struts-default" >
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="timer"/>
<interceptor-ref name="logger"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
</package>
Run Code Online (Sandbox Code Playgroud)
然后在另一个命名空间中使用myStack:
<package name="posts" namespace="/posts" extends="struts-default,json-default">
<action name="question/ask" class="someclass.QuestionAction">
<interceptor-ref name="myStack"></interceptor-ref>
<result name="success">/WEB-INF/jsp/post_question.jsp</result>
<result name="input">/WEB-INF/jsp/post_question.jsp</result>
</action>
</package>
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为在包帖中,它找不到名为myStack的拦截器堆栈.我怎么解决这个问题?
我正在测试/切换到Java EE7(Glassfish 4),我遇到的一个问题是拦截器,每当我尝试运行项目时,我都会收到以下错误.
严重:加载应用程序时出现异常:CDI部署失败:WELD-001417文件中启用拦截器类com.xxxxxx.security.SecuredInterceptor:/home/xxxxxx/xxxxxx/target/xxxxxx/WEB-INF/beans.xml@7既不是注释@Interceptor也没有通过便携式扩展注册
我正在看CDI 1.1规范的1.3.6节,它看起来没什么变化,所以我做错了什么?
这是我正在使用的代码;
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Secured {}
Run Code Online (Sandbox Code Playgroud)
@Secured
@Interceptor
public class SecuredInterceptor implements Serializable
{
@AroundInvoke
public Object interceptSecured(InvocationContext ic) throws Exception
{
// Do Stuff
}
}
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="annotated">
<interceptors>
<class>com.xxxxxx.security.SecuredInterceptor</class>
</interceptors>
</beans>
Run Code Online (Sandbox Code Playgroud) 在下面的动作类中,我使用的是参数拦截器.
@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "struts-default")
@InterceptorRefs(@InterceptorRef(value="store", params={"operationMode", "AUTOMATIC"}))
public final class TestAction extends ActionSupport implements Serializable, ValidationAware, Preparable
{
private static final long serialVersionUID = 1L;
private String param1;
private String param2;
//Getters and setters.
public TestAction() {}
@Action(value = "TestMessage",
results = {
@Result(name=ActionSupport.SUCCESS, type="redirectAction", params={"namespace", "/admin_side", "actionName", "Test"}),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs={
@InterceptorRef(value="paramsPrepareParamsStack", params={"params.acceptParamNames", "param1, param2", "params.excludeParams", "extraParam", "validation.validateAnnotatedMethodOnly", "true"})
})
public String insert() {
// Do something. Add or update a row to …Run Code Online (Sandbox Code Playgroud) 我有一个函数,我希望在DbContext上的每个执行的Linq查询上运行,以在执行之前修改表达式树.我一直在看IDbCommandTreeInterceptor接口,但似乎没有提供一个表达式树(我认为这是可以理解的,因为它到达这一点时可能不是Linq查询).
有没有办法可以在执行前拦截和修改所有表达式?
NB.这必须是Linq树修改,因为我已经构建了一个修改Linq树的框架,最初用于Linq到SQL.
我的HibernateInterceptor出了问题.我扩展EmptyInterceptor并覆盖onFlushDirty方法.我使用此方法手动检查脏值(将先前值与当前值进行比较)以编写已更改实体的审计日志.问题是,在某些特定情况下,在调用方法onFlushDirty之前,相同的实体会多次传递给方法postFlush.之前的值和当前值不会因呼叫而发生变化.所以我的审计日志写了几次相同的更改.如果我的实体的变化(例如从属性NEW到IN_PROGRESS)这一变化传递两次或更多次的onFlushDirty.为什么会这样?这是一种奇怪的行为,在我看来并不是预期的.
拦截器的调用onFlushDirty是由auto-flushHibernate 的行为引起的.在会话期间执行查询时,它会刷新会话中的所有脏实体.我希望这对于一个脏实体只做一次,但似乎即使在刷新后该实体仍被标记为"脏".然后在会话中再次执行另一个查询 - 再次刷新实体.旧值和当前值与第一次刷新时相同.
我尝试用测试用例重现这个问题,但我无法挑起这样的多次刷新.我希望你在我调试整个Hibernate代码之前,Hibernate专家可以帮助我解决这个问题.
干杯,克里斯
我有一个抽象的基类,它包含几个方法,其中一个我需要随时拦截.基类可以由用户定义的类继承,并在应用程序启动时向容器注册.如果用户尚未注册,则容器安装程序将自行注册一个.
这是问题 - 用户不必担心添加拦截器.容器应该自己添加它,无论注册组件的人和位置.
这就是我现在正在做的事情:
if(!container.Kernel.HasComponent(typeof(MyBaseComponent)))
container.Register(Component.For<MyComponent>()
.Interceptors(InterceptorReference
.ForType<MyComponentMethodInterceptor>())
.SelectedWith(new MyComponentMethodSelector()).AtIndex(1));
Run Code Online (Sandbox Code Playgroud)
MyComponentMethodSelector是一个简单的IInterceptorSelector,它检查methodname是否等于我需要拦截的那个(在这种情况下MyComponentMethodInterceptor会添加一个).
如您所见,它将检查组件是否已首先注册.
问题是 - 如果已经注册,我是否有办法添加拦截器?想到的最明显的选择是使用a IContributeComponentModelConstruction,但是在那时我将无法选择拦截器添加到的方法.还是有吗?
编辑:
我本来应该更具体一点.我只需要为特定方法添加拦截器.因此我为什么使用MyComponentMethodSelector.我知道IContributeComponentModel,我开始用它直到我意识到我无法添加方法选择器.
@AroundInvoke如果拦截的方法是通过端点作为SOAP Web服务从应用程序外部调用的,则在类上调用拦截器两次.
如果从另一个bean 内部调用相同的方法,它只被调用一次(正如我所料).@WebService
截获的方法本身始终只调用一次!
问题1:我可以只拦截一次拦截器吗?
问题2:如果我不能,是否有可转移的(服务器独立的)方式来决定我在哪个拦截器中,那么我可以忽略多余的拦截器?
问题3:这种行为是否常见(并在某些文档中定义和描述),还是依赖于我的特定环境(JBoss EAP 6.4.0)?
观察:
InvocationContext两个调用的实现类都不同.contextData,在InvocationContext沿着拦截器链传递数据的字段中,是不是的一个实例HashMap,但是WrappedMessageContext,却没有换其他的contextData呢.(我删除了包名.)
import javax.jws.WebService;
@WebService
public interface MyEndpoint {
public static final String SERVICE_NAME = "MyEndpointService";
public String getHello();
}
Run Code Online (Sandbox Code Playgroud)
import javax.interceptor.Interceptors;
import javax.jws.WebService;
@WebService(endpointInterface = "MyEndpoint", serviceName = MyEndpoint.SERVICE_NAME)
@Interceptors({TestInterceptor.class})
public class MyEndpointImpl implements …Run Code Online (Sandbox Code Playgroud) private void setUpRestClient() {
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header("Accept", "application/pyur.v1")
.header("Authorization", new SharedPreferencesUtil(getBaseContext()).getToken())
.header("Content-Type", "application/json")
.method(original.method(),original.body())
.build();
return chain.proceed(request);
}
});
RestClient.getInstance().configureRestAdapter(this, getResources().getString(R.string.base_url),client);
}
public void configureRestAdapter(final Context context, String baseUrl, OkHttpClient client) {
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC)
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
service = retrofit.create(NetworkServiceInterface.class);
}
Run Code Online (Sandbox Code Playgroud)
这现在让我在Retrofit 2.0中失败了,最初我没有"授权"标题,并且它给了我未经授权的,这是可以理解的.但是现在我用我的身份验证令授权它并且它失败了.Retrofit …
我没有在文档中找到如何扩展HttpClient或如何为我的一些HTTP请求指定不同的拦截器.在文档中,他们解释了如何设置拦截器,HTTP_INTERCEPTORS但每个HTTP请求都被截获.
我需要自定义HttpClient实现来设置细节标题,端点或响应拦截器(我不想使用Restangular,我更喜欢使用内置的角度HttpClient实现).
Authorization: Bearer...和API-KEY)和特定的响应拦截器来捕获所有HTTP 401响应.我知道这可以使用Restangular,但我更喜欢使用HttpClient.这怎么可能 ?
我发现这篇文章但是,这Http不适用于HttpClient角度4.3 的新实现.
interceptor ×10
aop ×2
struts2 ×2
.net ×1
angular ×1
api ×1
c# ×1
cdi ×1
glassfish ×1
hibernate ×1
http-headers ×1
httpclient ×1
java ×1
java-ee ×1
java-ee-7 ×1
jsp ×1
linq ×1
nhibernate ×1
retrofit2 ×1
web-services ×1