diff --git a/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java b/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java
index ca994dc27..3cb880832 100644
--- a/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java
@@ -537,8 +537,8 @@ public void invokeContextCallback(FacesContext context, UIComponent target)
// At this point if the algorithm hasn't returned and the topExpression does not have any separator char
// we need to do the search backward using findComponent.
if (target == null
- && searchExpressionContext.getSource() == previous
- && (topExpression.indexOf(separatorChar) == -1) )
+ && searchExpressionContext.getSource() == previous
+ && (topExpression.indexOf(separatorChar + "@") == -1) ) // updated for MYFACES-4695
{
UIComponent baseNC = previous.getNamingContainer();
if (baseNC != null && baseNC.getParent() != null)
diff --git a/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java b/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java
index 5c1777ff8..77ae38a75 100644
--- a/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java
+++ b/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java
@@ -410,6 +410,24 @@ public void testIsPassthroughExpression() throws Exception
Assert.assertFalse(handler.isPassthroughExpression(searchContextWithAjaxResolve, "@form:@child(0)"));
}
+ @Test
+ public void testMyFaces4695() throws Exception
+ {
+ startViewRequest("/search2.xhtml");
+ processLifecycleExecute();
+ executeBeforeRender();
+ executeBuildViewCycle();
+
+ SearchExpressionContext searchContext =
+ SearchExpressionContext.createSearchExpressionContext(facesContext, facesContext.getViewRoot().findComponent("form2:submit"));
+
+ SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler();
+
+ Assertions.assertEquals("form1:one", handler.resolveClientId(searchContext, "form1:one"));
+
+ processRemainingPhases();
+ }
+
/*
@Test
public void testCompositeComponentExpression() throws Exception
diff --git a/impl/src/test/resources/org/apache/myfaces/component/search/search2.xhtml b/impl/src/test/resources/org/apache/myfaces/component/search/search2.xhtml
new file mode 100644
index 000000000..187be74d0
--- /dev/null
+++ b/impl/src/test/resources/org/apache/myfaces/component/search/search2.xhtml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+