- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
最近我开始使用 SecurityEntityFilteringFeature。放置在 Jersey 环境中的代码下方。
environment.jersey().register(SecurityEntityFilteringFeature.class);
environment.jersey().register(JacksonFeature.class);
我所有返回自定义对象或映射的资源类开始抛出以下异常
com.fasterxml.jackson.databind.JsonMappingException: Can not resolve PropertyFilter with id 'uk.co.froot.demo.openid.resources.PublicOAuthResource$1'; no FilterProvider configured
at com.fasterxml.jackson.databind.ser.std.StdSerializer.findPropertyFilter(StdSerializer.java:285)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:459)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:29)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:129)
at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:851)
at com.fasterxml.jackson.jaxrs.base.ProviderBase.writeTo(ProviderBase.java:648)
at org.glassfish.jersey.jackson.internal.FilteringJacksonJaxbJsonProvider.writeTo(FilteringJacksonJaxbJsonProvider.java:135)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:106)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:86)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1128)
at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:664)
at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:421)
at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:411)
最佳答案
由于没有适合我的解决方案,我不得不创建自己的过滤器。其中使用了 Java 安全注释。根据我的自定义要求,我必须在请求中为用户设置角色。并在过滤器中使用
package com.buzzy.jersey.provider;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.annotation.security.DenyAll;
import javax.annotation.security.RolesAllowed;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.Provider;
import org.apache.commons.lang3.ClassUtils;
import uk.co.froot.demo.openid.model.security.Authority;
/**
* @author Sanjay Patel (sanjaypatel at ibm.com)
*/
@Provider
public class FilterResponseFilter implements ContainerResponseFilter {
@Context
private ResourceInfo resourceInfo;
@Context
private HttpServletRequest request;
@Override
public void filter(ContainerRequestContext requestContext,
ContainerResponseContext responseContext) throws IOException {
if(responseContext.getEntity()!=null)
filterObject(((Authority)request.getAttribute("hasAuthority")),responseContext.getEntity());
}
private void filterObject(Authority auth, Object entity) {
if(entity instanceof List) {
for(Object obj: (List)entity)filterObject(auth,obj);
}
else if(entity instanceof Map) {
for(Object obj : ((Map)entity).values()) filterObject(auth,obj);
}
else if(entity instanceof Object[]){
for(Object obj: (Object[])entity)filterObject(auth,obj);
}
else if(!ClassUtils.isPrimitiveOrWrapper(entity.getClass()) && !(entity instanceof String)){
try{
for(Method method:entity.getClass().getMethods()){
if(method.getName().startsWith("get") && !method.getName().equals("getClass")){
String fieldName = method.getName().substring(3);
fieldName=fieldName.substring(0, 1).toLowerCase()+fieldName.substring(1, fieldName.length());
Field field = entity.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
if(method.getAnnotation(DenyAll.class)!=null ){
field.set(entity, null);
}
if(method.getAnnotation(RolesAllowed.class)!=null){
if(auth!=null && Arrays.asList(method.getAnnotation(RolesAllowed.class).value()).contains(auth.name())){
if(!ClassUtils.isPrimitiveOrWrapper(method.getReturnType()) && !(entity instanceof String)){
filterObject(auth, field.get(entity));
}
}
else{
field.set(entity, null);
}
}
}
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
并注册到 dropwizard/jersey。
environment.jersey().register(FilterResponseFilter.class);
关于java - 泽西 jackson 禁用 filterprovider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31079510/
我尝试使用 Jersey/Spring/Hibernate 部署应用程序,每次我尝试部署它时都会抛出此异常: SEVERE: Context initialization failed jav
这个问题已经有答案了: Java get ResultSet from SQL Array is Failing (1 个回答) 已关闭 8 年前。 我当前在尝试运行此 Sql 命令时遇到此异常:SE
我想使用 Jetty + Jersey 生成 JSON。我的 POM.XML 类似于这篇文章:How do I update example to work with latest versions
我面对的是 Jersey 2.7。这是我的服务: package edu.srv.rest; import javax.ws.rs.GET; import javax.ws.rs.POST; impo
我很难理解 Jersey 的注入(inject)机制。 JAX-RS 规范 (http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-
我使用 jersey 实现了 REST 服务。通信层通过 ssl 进行保护。在客户端,我收到了这样的要求:在调用服务并验证服务器端的请求之前,我应该签署 xml。 http://docs.oracle
我用Tomcat做了一个Jersey maven项目,现在我想将它连接到Mysql数据库。我进入数据源浏览器 -> 数据库连接 -> 新驱动程序定义,但是当我选择 MySQL JDBC Driver
我正在从事一个企业项目,该项目有一个 EJB 模块和一个在 GlassFish v3.1、Weld v1.1 和 Jersey 上运行的 Web 项目。在 EJB 中,我定义了一个实体类 Manufa
我花了太多时间(我会说超过 10 个小时)试图弄清楚如何获取基本的 json 调用(来自 angularjs)以在我的 Jersey 2.4 上打开和处理。我已经在谷歌上尝试了所有可能的结果,但仍然得
最近我开始使用 SecurityEntityFilteringFeature。放置在 Jersey 环境中的代码下方。 environment.jersey().register(SecurityEn
我有一个包含多个字段和文件上传的 HTML 表单。 在 Java 方面,我收到了如下表单,并且有效: @Component("org.phenotips.metabolites.FileUploade
我想为资源的 REST 接口(interface)提供这样的方法 @POST @Consumes(MediaType.APPLICATION_JSON) public void add(@Auth U
我是 Restful Web 服务的新手。我想通过 Jersey 客户端访问服务器。但我收到了 500 错误。我想做的是通过客户端提交表名称并以 JSON 形式检索表内容。谁能找到这里的错误吗? 这是
我在部署 Web 应用程序时遇到以下异常。使用weblogic 12c (JerseyWebTarget.java:71) at org.glassfish.jersey.cl
完整存档: google drive (Tomcat 7.0) 我重复了 Jersey Restful exception 中的代码 本地测试网址 - http://localhost:8080/te
我正在使用 jersey 1.8、tomcat 7 和 spring 4 构建 jersey Rest api 此服务将具有基本 HTTP 身份验证,并将提供任何来源的信息(它将由来自不同域的客户使用
我正在从现在只读的谷歌群组 App Engine for Java 中重新提出一个 Unresolved 问题,因为我有完全相同的问题。 ( original ) 我使用 jersey、jaxb 和
检测问号 我需要实现一个协议(protocol),用户可以在该协议(protocol)中提供附加到 URL 的问号,以便检索有关所提供资源的附加信息。我知道 URL 资源后面的问号表示查询参数。不幸的
我正在用 Jersey 编写一个 Restful Web 服务,这是示例代码: @GET @Produce(MediaType.APPLICATION_JSON) public String find
我有客户像这样传递 ID:/v1/path?id=1,2,3 我拥有的和想要的 我有一个 Dropwizard/Jersey 的资源类。我想在资源的 GET 方法中将查询参数 id=1,2,3 显示为
我是一名优秀的程序员,十分优秀!