小编Ald*_*den的帖子

在Java 8中扩展List <T>

我经常想将一个列表映射到另一个列表.例如,如果我有一个人员列表,我想要一个他们的名字列表,我想这样做:

目标

List<Person> people = ... ;

List<String> names = people.map(x -> x.getName());
Run Code Online (Sandbox Code Playgroud)

使用Java 8可以实现这样的功能:

JAVA 8版

List<String> names = people.stream()
                           .map(x -> x.getName())
                           .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但这显然不是那么好.事实上,我认为使用番石榴更清洁:

GUAVA版本

List<String> names = Lists.transform(people, x -> x.getName());
Run Code Online (Sandbox Code Playgroud)

但是,我喜欢链接.那么,我的目标是否可行?

我听说有人说Java 8默认方法类似于C#扩展方法.使用C#扩展方法,我可以轻松地将辅助方法添加到IEnumerable<T>:

public static IEnumerable<TRet> Map<T, TRet>(this IEnumerable<T> list, Func<T, TRet> selector)
{
    return list.Select(selector);
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何使用默认方法来扩展现有接口.

此外,这显然是一个微不足道的例子.通常,我希望能够扩展List<T>Iterable<T>接口,以便更容易地与流api进行交互.

java lambda guava java-8 default-method

11
推荐指数
1
解决办法
2074
查看次数

Jersey Async ContainerRequestFilter

我有一个Jersey REST API并使用a ContainerRequestFilter来处理授权.我也在@ManagedAsync所有端点上使用,以便我的API可以服务数千个并发请求.

我的授权过滤器命中远程服务,但是当运行过滤器时,Jersey还没有将当前线程添加到它的内部ExecutorService,所以我完全失去了异步的好处.

我可以告诉泽西岛我希望这ContainerRequestFilter是异步的吗?

@Priority(Priorities.AUTHORIZATION)
public class AuthorizationFilter implements ContainerRequestFilter
{
    @Inject
    private AuthorizationService authSvc;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException
    {
        String authToken = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);

        // HITS A REMOTE SERVER
        AuthorizationResponse authResponse = authSvc.authorize(authToken);

        if (!authResponse.isAuthorized())
        {
            requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED)
                    .entity("unauthorized!")
                    .build());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例资源:

@Path("/stuff")
@Produces(MediaType.APPLICATION_JSON)
public class StuffResource
{
    @GET
    @Path("/{id}")
    @ManagedAsync
    public void getById(@PathParam("id") long id, @Suspended final AsyncResponse ar)
    {
        Stuff s;

        // HIT THE DATABASE …
Run Code Online (Sandbox Code Playgroud)

java rest asynchronous jersey jersey-2.0

10
推荐指数
1
解决办法
4135
查看次数

Sentry raven-java用户上下文

如何使用sentry raven-java客户端设置用户上下文?

我已经尝试添加user_email标签,并添加user_email到MDC.它们都按预期工作,标签转到标签,MDC转到其他数据,但都没有设置哨兵用户上下文.

我也使用javascript的哨兵,使用raven-js,这很好用:

Raven.setUserContext({
    email: '',
    id: ''
});
Run Code Online (Sandbox Code Playgroud)

是否有Java等价物?

java sentry raven

8
推荐指数
1
解决办法
1123
查看次数

以编程方式配置LogBack DBAppender

我试图让LogBack DBAppender从编程配置中运行,但似乎无法让它运行起来.

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
DBAppender dbAppender = new DBAppender();
dbAppender.setContext(lc);
DriverManagerConnectionSource connectionSource = new DriverManagerConnectionSource();
connectionSource.setDriverClass("com.mysql.jdbc.Driver");
connectionSource.setUrl(loggingConnectionInfo.getUri());
connectionSource.setUser(loggingConnectionInfo.getUser());
connectionSource.setPassword(loggingConnectionInfo.getPassword());
connectionSource.setContext(lc);
connectionSource.start();
dbAppender.setConnectionSource(connectionSource);
dbAppender.start();

logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
logger.setLevel(Level.DEBUG);
logger.addAppender(dbAppender);
Run Code Online (Sandbox Code Playgroud)

知道什么可能是错的吗?我在控制台上看到了一个日志,但没有任何内容进入数据库.已经有一段时间与这个战斗,并将欣赏任何见解!

java logging logback

7
推荐指数
1
解决办法
825
查看次数

带有Jersey资源的HK2 MethodInterceptor

如何设置aop MethodInterceptor以使用Jersey资源?

以下是我已经试过,以下这个文件:

第1步 - InterceptionService

public class MyInterceptionService implements InterceptionService
{
    private final Provider<AuthFilter> authFilterProvider;

    @Inject
    public HK2MethodInterceptionService(Provider<AuthFilter> authFilterProvider)
    {
        this.authFilterProvider = authFilterProvider;
    }

    /**
     * Match any class.
     */
    @Override
    public Filter getDescriptorFilter()
    {
        return BuilderHelper.allFilter();
    }

    /**
     * Intercept all Jersey resource methods for security.
     */
    @Override
    @Nullable
    public List<MethodInterceptor> getMethodInterceptors(final Method method)
    {
        // don't intercept methods with PermitAll
        if (method.isAnnotationPresent(PermitAll.class))
        {
            return null;
        }

        return Collections.singletonList(new MethodInterceptor()
        {
            @Override
            public Object invoke(MethodInvocation …
Run Code Online (Sandbox Code Playgroud)

java aop jersey jersey-2.0 hk2

5
推荐指数
1
解决办法
3025
查看次数