我正在尝试将表从多对一映射切换为具有中间映射表的多对多映射.但是,当我切换它并试图用NHibernate对它进行查询时,它给了我这个错误:"Interceptor.OnPrepareStatement(SqlString)返回null或空SqlString."
我的查询最初是一些更复杂的问题,但是我将其切换为基本的提取全部并且我仍然遇到问题:
Session.QueryOver<T>().Future();
Run Code Online (Sandbox Code Playgroud)
它似乎是我的模型映射文件中的问题或我的数据库中的某些东西.
这是我的模型映射:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="GBI.Core" namespace="GBI.Core.Models">
<class name="Market" table="gbi_Market">
<id name="Id" column="MarketId">
<generator class="identity" />
</id>
<property name="Name" />
<property name="Url" />
<property name="Description" type="StringClob" />
<property name="Rating" />
<property name="RatingComment" />
<property name="RatingCommentedOn" />
<many-to-one name="RatingCommentedBy" column="RatingCommentedBy" lazy="proxy"></many-to-one>
<property name="ImageFilename" />
<property name="CreatedOn" />
<property name="ModifiedOn" />
<property name="IsDeleted" />
<many-to-one name="CreatedBy" column="CreatedBy" lazy="proxy"></many-to-one>
<many-to-one name="ModifiedBy" column="ModifiedBy" lazy="proxy"></many-to-one>
<set name="Content" where="IsDeleted=0 and ParentContentId is NULL" order-by="Ordering asc, CreatedOn asc, Name asc" lazy="extra"> …Run Code Online (Sandbox Code Playgroud) 我正处于创建输出拦截器的阶段,我从SOAP消息中获取了一个OuputStream.但是如何在将SOAP信封发送到端点之前修改它呢?我想删除一些xml元素.
我知道Struts2 Action类是线程安全的,因为操作放在Value Stack中.值栈依次是Action Context的一部分.由于Action Context是线程本地的,因此存储在Action Context(包括值栈)中的值对于每个线程都是唯一的.因此,Actions是线程安全的.
但考虑一下拦截器:它们非常有用,它们为程序员完成所有那些繁琐的小工作......比如验证,获取参数值等等.但需要考虑的是:拦截器可以在多个请求之间共享.那么这会使拦截器线程不安全吗?
考虑到这个问题,我试图在网上浏览一些与此问题相关的好文章.我发现了一篇非常好的文章,他们已经清楚地提到了一个示例拦截器如何不是线程安全的.
该网页是:http: //www.bullraider.com/java/struts2/tutorials/interceptors-and-thread-safety
我从这篇文章中得知,拦截器线程不安全的主要原因是拦截器只创建了一次.即每个拦截器只有一个对象.因此,当线程之间共享Interceptor 的相同实例时,实例字段不安全.
在文章的最后,提到有些情况,甚至拦截器都是线程安全的.但他们没有提到任何此类案件.我在网上冲浪找到答案......但是徒劳无功:(
任何人都可以告诉我或给我一个链接,在那里我可以找到如何使拦截器线程安全(或拦截器线程安全时的情况是什么)?
我们需要在REST调用期间发生异常时返回自定义错误代码和错误消息.我们已经创建了一个异常映射器提供程序,它适用于应用程序代码中的异常.但是,当从CXF代码发生异常时(例如,形成我编写的CustomValidationInterceptor),它不起作用.
例如,如果我请求无效路径参数(例如无效的phoneNumber).在这种情况下,我们需要返回一个JSON格式的自定义错误代码和错误消息,但即使我们创建以处理WebApplicationException一个例外映射器提供商这是行不通的.
有没有办法处理来自cxf拦截器的异常并返回对用户的响应,如下所示?
{
"errorDetail": {
"errorCode": "404",
"errorMessage": "Bad Request"
}
}
Run Code Online (Sandbox Code Playgroud)
我的CustomValidationInterceptor的代码片段:
public class CustomValidationInterceptor extends AbstractPhaseInterceptor<Message>{
public CustomValidationInterceptor() {
super(Phase.PRE_INVOKE); // Put this interceptor in this phase
}
public void handleMessage(Message message) {
MetadataMap<String, String> metadataMap = (MetadataMap<String, String>) message.get("jaxrs.template.parameters");
if(null != metadataMap) {
List<String> list = metadataMap.get("phoneNumber");
if(null != list) {
String phoneNumber = list.get(0);
boolean result = validatePhoneNumber(phoneNumber);
if(!result){
throw new TelusServiceException(Response.status(Response.Status.BAD_REQUEST).build(), 400, "phone number not valid");
}
} else {
throw new TelusServiceException(Response.status(Response.Status.BAD_REQUEST).build(), 400, …Run Code Online (Sandbox Code Playgroud) 我们可以使用拦截器以及transformRequest和transformresponse来修改数据.
除了拦截器只能在全球范围内添加之外,还有什么区别呢?
此外,即使加载部分也是HTTP get请求,并且响应返回数据.怎么处理这个?
我有用于身份验证的自定义拦截器:
@Named("authInterceptor")
@Provides
@Singleton
fun providesAuthInterceptor(preferencesManager: PreferencesManager): Interceptor {
return Interceptor { chain ->
val newBuilder = chain.request().newBuilder()
newBuilder.addHeader("access-token", preferencesManager.getAccessToken())
val request = newBuilder.build()
return@Interceptor chain.proceed(request)
}
}
Run Code Online (Sandbox Code Playgroud)
但是我有一些不需要 auth 标头的调用。
我希望在我的服务中拥有的是:
interface NetService {
@NEEDAUTH
@GET("users")
fun getAllShops(key: String): Single<SomeResponse>
@FormUrlEncoded
@POST("users")
fun register(@Field("nickname") nickname: String): Single<SomeResponse>
}
Run Code Online (Sandbox Code Playgroud)
因此,第一个调用将使用 authInterceptor,第二个调用将不使用它。
我目前正在手动构建一个假装客户端并将拦截器传递给它进行授权.我想为一些响应代码提供更智能的Retryer.
public class myErrorEncoder extends ErrorDecoder.Default {
@Override
public Exception decode(final String methodKey, final Response response) {
if (response.status() == 401) {
String token = refreshToken(); // I would like to refresh the token and Edit the client
return new RetryableException("Token Expired will retry it", null);
} else {
return super.decode(methodKey, response);
}
}
Run Code Online (Sandbox Code Playgroud)
}
拦截器
@Bean public CustomInterceptor getInterceptor(String token) {
return new CustomInterceptor(token);}
Run Code Online (Sandbox Code Playgroud)
假装建设者
private <T> T feignBuild(final Class<T> clazz, final String uri, final String token) {
return …Run Code Online (Sandbox Code Playgroud) 基本上如标题所说。Apache HttpClient 和 Spring RestTemplate 允许定义自定义拦截器,这些拦截器环绕请求/响应并允许额外(全局)修改请求参数、日志记录等......
我在标准 Java 实现中没有看到这样的功能java.net.http.HttpClient(从 Java 11 开始)。我是否遗漏了某些东西,或者没有办法在单个上拦截所有请求/响应HttpClient?
我正在尝试创建一个 WebView,它有一个钩子,可以捕获每个请求,拦截它,允许我编辑它并随后发送它。但我无法找到一种方法来拦截 webview 的每个请求(不仅仅是使用 onNavigationStateChange 进行 url 更改)。
下一步也将改变响应。
有什么想法可以在 React Native 中实现这样的事情吗?
我想添加一个 Loader 组件,以便在React 中进行 API 调用时呈现。我想使用react context + hooks 而不是 redux。
正如反应钩子的规则所说,我们不应该在反应组件之外使用反应钩子。但是我需要在Axios拦截器内部分派SHOW_LOADER和,如下所示。HIDE_LOADER
有没有办法实现这一目标?
import axios from "axios";
axios.interceptors.request.use(
config => {
dispatch({
type: "SHOW_LOADER"
})
return config;
},
error => {
dispatch({
type: "HIDE_LOADER"
})
return Promise.reject(error);
}
);
axios.interceptors.response.use(
response => {
dispatch({
type: "HIDE_LOADER"
})
return response;
},
error => {
dispatch({
type: "HIDE_LOADER"
})
return Promise.reject(error);
}
);
function GlobalLoader(){
const [state,dispatch] = useContext(LoaderContext);
return(
<div>
{
state.loadStatus …Run Code Online (Sandbox Code Playgroud) interceptor ×10
java ×5
cxf ×2
http ×2
reactjs ×2
ajax ×1
android ×1
angularjs ×1
axios ×1
exception ×1
feign ×1
javascript ×1
jax-rs ×1
nhibernate ×1
okhttp3 ×1
outputstream ×1
react-hooks ×1
react-native ×1
retrofit2 ×1
struts2 ×1
webview ×1