Solución:
Aparentemente, cuando un patrón de solicitud se asigna a un método a través del @RequestMapping
anotación, se asigna a la implementación del método concreto. Entonces, una solicitud que coincida con la declaración invocará GoalServiceImpl.removeGoal()
directamente en lugar del método que originalmente declaró el @RequestMapping
es decir GoalService.removeGoal()
.
Desde una anotación en una interfaz, método de interfaz o parámetro de método de interfaz no se transfiere a la implementación, no hay forma de que Spring MVC reconozca esto como un @PathVariable
a menos que la clase de implementación lo declare explícitamente. Sin él, cualquier consejo de AOP que se dirija @PathVariable
los parámetros no se ejecutarán.
La característica de definir todos los enlaces en la interfaz se implementó recientemente en Spring 5.1.5.
Consulte este problema: https://github.com/spring-projects/spring-framework/issues/15682 – fue una lucha 🙂
Ahora realmente puedes hacer:
@RequestMapping("/random")
public interface RandomDataController {
@RequestMapping(value = "/{type}", method = RequestMethod.GET)
@ResponseBody
RandomData getRandomData(
@PathVariable(value = "type") RandomDataType type, @RequestParam(value = "size", required = false, defaultValue = "10") int size);
}
@Controller
public class RandomDataImpl implements RandomDataController {
@Autowired
private RandomGenerator randomGenerator;
@Override
public RandomData getPathParamRandomData(RandomDataType type, int size) {
return randomGenerator.generateRandomData(type, size);
}
}
Incluso puede usar esta biblioteca: https://github.com/ggeorgovassilis/spring-rest-invoker
Para obtener un proxy de cliente basado en esa interfaz, de manera similar a cómo funciona el marco del cliente RestEasys en la tierra JAX-RS.
Funciona en la versión más reciente de Spring.
import org.springframework.web.bind.annotation.RequestMapping;
public interface TestApi {
@RequestMapping("/test")
public String test();
}
Implementar la interfaz en el controlador
@RestController
@Slf4j
public class TestApiController implements TestApi {
@Override
public String test() {
log.info("In Test");
return "Value";
}
}
Se puede utilizar como: Cliente de descanso.