[
https://issues.apache.org/jira/browse/ARIES-1849?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Nicolas Dutertry updated ARIES-1849:
------------------------------------
Description:
Since Java 8 it is possible to define default implementations inside interface
definition.
It seems that Aries proxy is not compatible with interface default methods. As
a result it is not possible to use a blueprint reference to a service
implementing an interface with default method.
The following unit test demonstrates the issue :
{code:java}
import java.util.Collections;
import org.apache.aries.proxy.UnableToProxyException;
import org.apache.aries.proxy.impl.interfaces.InterfaceProxyGenerator;
import org.junit.Assert;
import org.junit.Test;
public class InterfaceProxyGeneratorTest {
public static interface Service {
String getName();
default String getValue() {
return "default";
}
}
public static class ServiceImpl implements Service {
@Override
public String getName() {
return "serviceimpl";
}
@Override
public String getValue() {
return "value";
}
}
@Test
public void testProxy() throws UnableToProxyException {
ServiceImpl serviceImpl = new ServiceImpl();
Assert.assertEquals("serviceimpl", serviceImpl.getName());
Assert.assertEquals("value", serviceImpl.getValue());
Service proxy = (Service)InterfaceProxyGenerator.getProxyInstance(
null, null, Collections.singleton(Service.class),
() -> {
return serviceImpl;
},
null);
Assert.assertNotNull(proxy);
Assert.assertEquals("serviceimpl", proxy.getName());
Assert.assertEquals("value", proxy.getValue());
}
}{code}
was:
Since Java 8 it is possible to define default implementations inside interface
definition.
It seems that Aries proxy is not compatible with interface default methods. As
a result it is not possible to use a blueprint reference to a service
implementing an interface with default method.
The following unit test demonstrate the issue :
{code:java}
import java.util.Collections;
import org.apache.aries.proxy.UnableToProxyException;
import org.apache.aries.proxy.impl.interfaces.InterfaceProxyGenerator;
import org.junit.Assert;
import org.junit.Test;
public class InterfaceProxyGeneratorTest {
public static interface Service {
String getName();
default String getValue() {
return "default";
}
}
public static class ServiceImpl implements Service {
@Override
public String getName() {
return "serviceimpl";
}
@Override
public String getValue() {
return "value";
}
}
@Test
public void testProxy() throws UnableToProxyException {
ServiceImpl serviceImpl = new ServiceImpl();
Assert.assertEquals("serviceimpl", serviceImpl.getName());
Assert.assertEquals("value", serviceImpl.getValue());
Service proxy = (Service)InterfaceProxyGenerator.getProxyInstance(
null, null, Collections.singleton(Service.class),
() -> {
return serviceImpl;
},
null);
Assert.assertNotNull(proxy);
Assert.assertEquals("serviceimpl", proxy.getName());
Assert.assertEquals("value", proxy.getValue());
}
}{code}
> Aries proxy does not work with interface default methods
> --------------------------------------------------------
>
> Key: ARIES-1849
> URL: https://issues.apache.org/jira/browse/ARIES-1849
> Project: Aries
> Issue Type: Bug
> Components: Proxy
> Affects Versions: proxy-impl-1.1.2
> Reporter: Nicolas Dutertry
> Priority: Major
>
> Since Java 8 it is possible to define default implementations inside
> interface definition.
> It seems that Aries proxy is not compatible with interface default methods.
> As a result it is not possible to use a blueprint reference to a service
> implementing an interface with default method.
> The following unit test demonstrates the issue :
> {code:java}
> import java.util.Collections;
> import org.apache.aries.proxy.UnableToProxyException;
> import org.apache.aries.proxy.impl.interfaces.InterfaceProxyGenerator;
> import org.junit.Assert;
> import org.junit.Test;
> public class InterfaceProxyGeneratorTest {
> public static interface Service {
> String getName();
>
> default String getValue() {
> return "default";
> }
> }
>
> public static class ServiceImpl implements Service {
> @Override
> public String getName() {
> return "serviceimpl";
> }
>
> @Override
> public String getValue() {
> return "value";
> }
> }
>
> @Test
> public void testProxy() throws UnableToProxyException {
> ServiceImpl serviceImpl = new ServiceImpl();
> Assert.assertEquals("serviceimpl", serviceImpl.getName());
> Assert.assertEquals("value", serviceImpl.getValue());
>
> Service proxy = (Service)InterfaceProxyGenerator.getProxyInstance(
> null, null, Collections.singleton(Service.class),
> () -> {
> return serviceImpl;
> },
> null);
>
> Assert.assertNotNull(proxy);
> Assert.assertEquals("serviceimpl", proxy.getName());
> Assert.assertEquals("value", proxy.getValue());
> }
> }{code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)